2017-09-08 1 views
0

Je suis en train de sélectionner le dernier état MAX (DateTime) de la table « Zee » mais si le DateTime est le même, il retourne deux lignes, et je voudrais obtenir seulement dernier (peut-être dernier inséré?).Sélectionnez MAX (DateTime) renvoyant plusieurs lignes

ici est la requête:

SELECT Z."ID" AS ID,Z."A" AS A,Z."B" AS B,Z."C" AS C,Z."D" AS D 
FROM ZEE Z 
INNER JOIN 
    (SELECT ID, A, B, MAX(C) AS C 
    FROM ZEE 
    GROUP BY A, B) groupedtt 
ON Z.A = groupedtt.A 
AND Z.B = groupedtt.B 
AND Z.C = groupedtt.C 
WHERE (
     Z.B = 103 
    OR Z.B = 104 
); 

et le résultat:

enter image description here

Merci,

Cordialement.

+0

Ma suggestion: En savoir plus sur 'rownum ' –

+0

Peut être' ORDER BY ID DESC' et 'LIMIT 1' dans le travail de requête principale. Je parle de la syntaxe MySQL. –

+0

en double de https://stackoverflow.com/questions/121387/fetch-the-row-which-has-the-max-value-for-a-column (regroupement juste en plusieurs colonnes) – MT0

Répondre

1

J'utilise habituellement rang() pour de telles choses:

select Z."ID" AS ID,Z."A" AS A,Z."B" AS B,Z."C" AS C,Z."D" AS D 
from (select Z.*, rank()over(partition by A,B order by C desc, rownum) r from ZEE Z 
)Z where Z.r=1 
+1

Pourquoi utilisez-vous 'RANG 'avec' ROWNUM' au lieu de simplement utiliser 'ROW_NUMBER'? – MT0

+0

Eh bien, je suppose, c'est une habitude. Bien sûr, ROW_NUMBER peut être utilisé à la place du rang. – wolfrevokcats

+0

Merci, cela a résolu mon problème. –

1

Utilisez la fonction analytique ROW_NUMBER() (vous permettra également d'éliminer l'auto-jointure):

SELECT ID, A, B, C, D 
FROM (
    SELECT ID, 
     A, 
     B, 
     C, 
     D, 
     ROW_NUMBER() OVER (PARTITION BY A, B ORDER BY C DESC) As rn 
    FROM ZEE 
) 
WHERE rn = 1;