2009-04-30 4 views
2

J'ai besoin d'un ensemble d'enregistrements distincts pour une table avec la date maximale pour toutes les duplicata.Sélectionnez une ligne distincte avec la date maximale de la table SQL Server?

ex:

Select distinct a,b,c, Max(OrderDate) as maxDate 
From ABC 
Group By a,b,c 

La question est que je reçois un dossier de retour pour chaque date.

Ex:

aaa, bbb, ccc, Jan 1 2009 
aaa, bbb, ccc, Jan 28 2009 

Comment puis-je limiter ce si je finis avec seulement:

aaa, bbb, ccc Jan 28 2009 

Je suppose que la question est la gorup par et ne se distingue pas bien se entendre.

EDIT: a trouvé le problème à l'origine du problème, les résultats de la requête étaient comme prévu, pas comme ci-dessus.

+0

Il s'avère que c'était un autre problème à l'origine du problème. Les résultats ne sont pas ce que je m'attendais. Pardon. – schooner

+0

Veuillez clôturer votre question comme non pertinente alors. Merci – JoshBerke

+1

quelle était la solution? C'est bien que vous trouviez une solution, d'autres personnes en ont besoin ainsi – ant

Répondre

4

Quelque chose ne va pas avec votre requête ou avec vos résultats d'exemple, car ce que vous décrivez ne devrait pas être possible. Que diriez-vous de certains résultats SQL réels et réels? En tout état de cause, vous n'avez pas besoin de distinct puisque vous ne sélectionnez que vos trois colonnes groupées et un agrégat, donc vous aurez par définition toutes les lignes distinctes. Je n'ai jamais essayé cela, donc peut-être qu'il y a un mauvais comportement en utilisant les deux. Avez-vous essayé de supprimer le distinct? Qu'est-ce qui vous a amené à le mettre là?

+0

+1 pour être à mon avis la réponse la plus correcte. Je dois admettre que je suis très curieux de la réponse de Quassnoi sur votre commentaire. Ses compétences sont indiscutables, alors je suppose que nous devons manquer quelque chose. –

3
WITH q AS (
     SELECT abc.*, ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY orderDate DESC) AS rn 
     FROM abc 
     ) 
SELECT * 
FROM q 
WHERE rn = 1 

ayant un indice sur (a, b, c, orderDate) (dans cet ordre) va grandement améliorer cette requête.

+0

Cela semble juste comme un moyen inefficace d'accomplir la même chose que vous le feriez en regroupant, à moins que mon esprit ne fonctionne tout simplement pas. Qu'est-ce que j'oublie ici? –

+0

En supposant qu'il existe un index, il a la même efficacité que GROUP BY, mais sélectionne toutes les colonnes, et pas uniquement celles utilisées dans un GROUP BY. La question initiale demandait un «ensemble d'enregistrements». Je pense que j'ai raté ce que l'auteur voulait dire. – Quassnoi

+0

Intéressant, je n'avais pas réalisé que les fonctions de classement fonctionnaient avec la même efficacité que le regroupement. Est-ce parce que vous utilisez «partition par» plutôt que «commander par»? Je n'ai jamais vu cette phrase auparavant. Bon à savoir! –

1

Si vous exécutez cette requête:

select 'ab' as Col1, 'bc' as col2, 'cd' as col3, getdate() as Date 
into #temp 
insert into #temp 
values ('ab','bc','cd','1/15/09') 
insert into #temp 
values ('aa','bb','cc','1/1/09') 
insert into #temp 
values ('aa','bb','cc','1/22/09') 

select col1,col2,col3,max(date) 
from #temp 
group by col1,col2,col3 

Vous devez retourner:

aa, bb, cc, 2009-01-22 00: 00: 00.000
ab, bc, cd, 2009-04-30 09: 23: 07.090

Votre requête fonctionnera aussi donc quelque chose est vraiment faux ou vous n'avez pas communiqué correctement la nature exacte de votre code.

Questions connexes