0
votes

Subquier SQL simple

Il semble que je suis un idiot complet quand il s'agit de SQL ...

Tout ce dont j'ai besoin, c'est d'obtenir une valeur d'une autre table, mais il y a plusieurs lignes avec le même CustomerID sur la deuxième table .. J'aurais besoin de en obtenir un avec horodatage le plus élevé strong> p> xxx pré>

JOIN gauche apportera toutes les lignes de sorte que j'ai plusieurs identifiants en double Ce dont j'ai besoin est de manière proparineuse, mais je ne peux pas l'obtenir pour travailler ... P>

(SELECT CONFIRMED FROM settings WHERE ?? c.id == l.id ?? AND MAX(TIMESTAMP) )


1 commentaires

Veuillez fournir des données d'échantillonnage et des résultats souhaités.


3 Réponses :


0
votes

Vous pouvez utiliser un Row_Number () code> dans la sous-requête:

SELECT c.id as id, c.LANG as Language, c.ALLOWEMAIL as AllowEmail,
       l.CONFIRMED as confirmed
FROM cus.CUSTOMER c JOIN
     (SELECT s.*,
             ROW_NUMBER() OVER (PARTITION BY s.id ORDER BY s.timestamp DESC) as seqnum
      FROM settings s
     ) s
     ON s.id = c.id AND s.seqnum = 1;


2 commentaires

Il dit que la table créée, mais lorsque j'essaie de choisir * à partir de la nouvelle vue, je viens d'obtenir 01722. 00000 - "Numéro invalide"


@Clomez. . . Rien dans cette requête ne fait évidemment aucune conversion de type. S'il est basé sur cette requête, vous devriez alors regarder la condition .



0
votes

Vous pouvez utiliser des fonctions analytiques. Max () Over (Partition par) La clause CODE> peut vous donner une identification maximale horodatale.

Fonctions analytiques DOCS 11GR2 P>

SELECT SECONDD.CONFIRMED
FROM CUSTOMER CU
   INNER JOIN
   (SELECT 
           *
      FROM (SELECT SECONDD.*,
                   MAX (S.TIMESTAMP) OVER (PARTITION BY S.ID)
                      AS MAXTIMESTAMP
              FROM SETTINGS SECONDD)
     WHERE TIMESTAMP = MAXTIMESTAMP) SECONDD
      ON SECONDD.ID = CU.ID


0 commentaires

0
votes

Ne t'inquiète pas; Bien que cela sonne très basique, ce n'est pas le cas: -)

Le moyen le plus simple d'obtenir la confirmation du dernier horodatage dans Oracle est garder la dernière code>. EG: P>

CREATE OR REPLACE VIEW cus_settings as
SELECT 
  c.id AS id,
  c.lang AS language,
  c.allowemail AS allowemail,
  (
    SELECT MAX(confirmed) KEEP (DENSE_RANK LAST ORDER BY timestamp)
    FROM settings s
    WHERE s.customer_id = c.id
  ) AS confirmed
FROM cus.customer c;


2 commentaires

ORA-00913: Trop de valeurs 00913. 00000 - "Trop de valeurs" ou aussi connu comme je ne comprends pas comment utiliser ceci


Eh bien, il semble que vous ayez mal placé en quelque sorte dans votre Create View Déclaration. J'ai mis à jour ma réponse avec le code.