Wählen Sie eine einzelne Zeile mit dem maximalen Datum aus der SQL Server-Tabelle aus?

Ich muss eine Reihe von unterschiedlichen Datensätzen für eine Tabelle zusammen mit dem maximalen Datum über alle Duplciates zu bekommen.

ex:

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

Das Problem ist, dass ich für jedes datum einen Datensatz bekomme.

Ex:

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

Wie kann ich das begrenzen, so dass ich am Ende nur:

aaa, bbb, ccc Jan 28 2009

Ich nehme an, das Problem ist das Gorup durch und deutlich nicht gut zu verstehen.

EDIT: Das Problem, das das Problem verursachte, wurde gefunden, Abfrageergebnisse waren wie erwartet und nicht wie oben.

Antwort auf "Wählen Sie eine einzelne Zeile mit dem maximalen Datum aus der SQL Server-Tabelle aus? " 3 von antworten

Etwas stimmt nicht, entweder mit Ihrer Abfrage oder mit Ihren Beispielergebnissen, da das, was Sie beschreiben, nicht möglich sein sollte. Wie wäre es mit einigen tatsächlichen SQL und tatsächlichen Ergebnissen?

In jedem Fall brauchen Sie dort kein distinct there since all you're selecting are your three grouped columns an an aggregate, so you'll by definition end up with all distinct rows. I've never tried this, so perhaps there is some misbehavior when using both of those. Have you tried removing the , da Sie nur Ihre drei gruppierten Spalten als Aggregat auswählen, sodass Sie definitionsgemäß alle unterschiedlichen Zeilen erhalten. Ich habe das noch nie ausprobiert, also gibt es vielleicht ein Fehlverhalten, wenn man beides benutzt. Haben Sie versucht, die distinct? What caused you to put it there? zu entfernen? Was hat Sie dazu bewoversetzen, es dort zu setzen?

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

Mit einem Index auf (a, b, c, orderDate) (in this order) will greatly improve this query. (in dieser Reihenfolge) wird diese Abfrage erheblich verbessern.

Wenn Sie diese Abfrage ausführen:

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

Sie sollten zurück:

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

Ihre Abfrage funktioniert auch, so dass etwas wirklich falsch ist oder Sie die genaue Art Ihres Codes nicht richtig kommuniziert haben.