Wählen Sie Werte mit maximalem timestempel

Ich habe einen Tisch:

id|val|updated 1 | 31|2012-01-12 1 | 34|2012-01-15 2 | 41|2012-01-15 3 | 44|2012-01-15 4 | 66|2012-01-01 

Und ich muss id und val mit maximal aktualisiertem Wert wählen. Also für diese Tabelle sollte Ergebnis sein:

 1| 34| 2012-01-15 2| 41| 2012-01-15 3| 44| 2012-01-15 4| 66| 2012-01-01 

Solutions Collecting From Web of "Wählen Sie Werte mit maximalem timestempel"

Dies erfordert ein MAX() Aggregat in einer Unterabfrage, die mit der Haupttabelle verbunden ist.

 SELECT tbl.id, tbl.val, tbl.updated FROM tbl JOIN ( /* Subquery gets MAX(updated) per id to JOIN against */ SELECT id, MAX(updated) as updated FROM tbl GROUP BY id ) t2 ON tbl.id = t2.id AND tbl.updated = t2.updated 

Ein paar andere "tragbare" Ansätze. In meinem sehr schnellen Test auf SQL SERVER 2008 schnitt Michaels Abfrage am besten ab

 SELECT T1.* FROM yourTable AS T1 WHERE NOT EXISTS( SELECT * FROM yourTable AS T2 WHERE T2.id = T1.id AND T2.updated > T1.updated ) SELECT T1.* FROM yourTable AS T1 LEFT JOIN yourTable AS T2 ON ( T2.id = T1.id AND T2.updated > T1.updated ) WHERE T2.id IS NULL 

Die ausgewählte Antwort funktioniert gut, aber hier ist eine schnellere Lösung. Es verwendet keine Joins sind Gruppen, die die Abfrage verlangsamen wird. Dieser verwendet Partitionen, die viel schneller sind als Gruppen und Joins. Hör zu:

 select id, val, Maxdate as updated from ( select id, val, Max(updated) over(partition by id order by updated desc) as MaxDate, Row_Number() over(partition by id order by updated desc) as RowNumber, from table1 ) where RowNumber = 1