Selezionare una riga distinta con data massima dalla tabella di SQL Server?
-
03-07-2019 - |
Domanda
Devo ottenere un set di record distinti per una tabella insieme alla data massima per tutti i duplciate.
ex:
Select distinct a,b,c, Max(OrderDate) as maxDate
From ABC
Group By a,b,c
Il problema è che ricevo un record per ogni data diversa.
Es .:
aaa, bbb, ccc, Jan 1 2009
aaa, bbb, ccc, Jan 28 2009
Come posso limitarlo, così finisco con solo:
aaa, bbb, ccc Jan 28 2009
Suppongo che il problema sia il gorup di e distinto non andare d'accordo.
EDIT: trovato il problema che stava causando il problema, i risultati della query erano come previsto, non come sopra.
Soluzione
Qualcosa non va nella tua query o nei risultati del tuo esempio, poiché ciò che descrivi non dovrebbe essere possibile. Che ne dici di alcuni SQL effettivi e dei risultati effettivi?
In ogni caso, non ti serve distinto
poiché tutto ciò che stai selezionando sono le tue tre colonne raggruppate un aggregato, quindi per definizione finirai con tutte le righe distinte. Non l'ho mai provato, quindi forse c'è qualche comportamento scorretto quando si usano entrambi. Hai provato a rimuovere il distinto
? Cosa ti ha spinto a metterlo lì?
Altri suggerimenti
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
Avere un indice su (a, b, c, orderDate)
(in questo ordine) migliorerà notevolmente questa query.
Se si esegue questa query:
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
Dovresti tornare indietro:
aa, bb, cc, 22-01-2009 00: 00: 00.000
ab, bc, cd, 2009-04-30 09: 23: 07.090
Anche la tua query funzionerà, quindi qualcosa non va o non hai comunicato correttamente la natura esatta del tuo codice.