Sélectionnez une ligne distincte avec une date maximale dans la table SQL Server?
-
03-07-2019 - |
Question
Je dois obtenir un ensemble d'enregistrements distincts pour une table ainsi que la date maximale pour tous les doublons.
ex:
Select distinct a,b,c, Max(OrderDate) as maxDate
From ABC
Group By a,b,c
Le problème est que je reçois un enregistrement pour chaque date différente.
Ex:
aaa, bbb, ccc, Jan 1 2009
aaa, bbb, ccc, Jan 28 2009
Comment puis-je limiter cela afin de me retrouver avec seulement:
aaa, bbb, ccc Jan 28 2009
Je suppose que le problème est le problème principal et distinct ne s'entend pas bien.
EDIT: le problème à l'origine du problème a été trouvé, les résultats de la requête étaient conformes aux attentes, pas à ceux décrits ci-dessus.
La solution
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 SQL et des résultats réels?
Dans tous les cas, vous n'avez pas besoin de distinct
, car vous ne sélectionnez que vos trois colonnes groupées et un agrégat, vous définissez donc par définition toutes les lignes distinctes. Je n'ai jamais essayé cela, alors peut-être qu'il y a un problème de comportement lorsque vous utilisez les deux. Avez-vous essayé de supprimer le distinct
? Qu'est-ce qui vous a amené à le mettre là?
Autres conseils
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
Avoir un index sur (a, b, c, orderDate)
(dans cet ordre) améliorera grandement cette requête.
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 devriez revenir en arrière:
aa, bb, cc, 2009-01-22 00: 00: 00.000
ab, cd, cd, 2009-04-30 09: 23: 07.090
Votre requête fonctionnera aussi, donc quelque chose ne va vraiment pas ou vous n'avez pas correctement communiqué la nature exacte de votre code.