2013-08-23 6 views
9

Ich habe eine Tabelle wie folgt:SQL Server Auswählen von Datensätzen mit jüngsten Datum Zeit

MyJob| MyKey |MyCode|MyDate| MyTime 
----------------------------------  
q183b| 0131081a | 24 |100315| 9:37   
q183b| 0131081a | 9 |100315| 11:38   
q183b| 0132426a | 1 |90314 | 15:36   
q183b| 0132426a | 2 |100315| 9:36   
q183b| 0132426a | 85 |100315| 11:36 

Beachten Sie, dass MyDate Format wird YYMMDD und MyTime im 24-Stunden-Format ist.

Ich möchte das Ergebnis von eindeutigen MyKey mit neuesten MyDate und MyTime zurückgeben. Das erwartete Ergebnis wird etwas wie sein:

MyJob | MyKey |MyCode| MyDate | MyTime   
q183b | 0131081a | 9 | 100315 | 11:38   
q183b | 0132426a | 85 | 100315 | 11:36 

Jede Hilfe wird sehr geschätzt werden. Vielen Dank.

+0

Was sind die Datentypen von 'MyDate' und' MyTime'? Und warum verwenden Sie die integrierten Datentypen nicht für Datum und Uhrzeit? –

+0

Derzeit sind sie Int und Nchar. Es spielt jedoch keine Rolle, wie ich diese Daten aus einer CSV-Datei importiere, und ich kann jeden Datentyp für sie definieren. – user2709309

+0

Mögliches Duplikat von [SQL Server: SELECT nur die Zeilen mit MAX (DATUM)] (https://stackoverflow.com/questions/7118170/sql-server-select-only-the-rows-with-maxdate) – Vadzim

Antwort

5

Kombinieren Sie die Datums- und Uhrzeitspalten zunächst in einer Datumszeit, damit Sie sie einfach bestellen können. Es ist eine Weile her, seit ich Sql Server benutzt habe, aber die Funktion row_number() und die Partitionierung ist eine einfache Möglichkeit, das Maximum einer Spalte nach einer anderen zu finden - die Partitionsklausel ähnelt einer Gruppe nach.

select t.* 
from 
(
    select t.MyKey, t.MyDateTime 
    , row_number() over 
     (partition by t.mykey order by t.MyDateTime desc) as keyOrderNbr 
    from table t 
) A 
inner join table t 
    on A.MyKey = t.MyKey 
    and A.MyDateTime = t.MyDateTime 
where A.keyOrderNbr = 1 
2

Zuerst müssen Sie Ihr Datum Char in ein Datumsfeld konvertieren, so dass Sie damit bestellen können. Und was können Sie tun, ist:

SELECT DISTINCT * 
FROM MyTable 
WHERE MyTable.MyDate = 
(
    SELECT MAX(Sub_MyTable.MyDate) 
    FROM MyTable 
    WHERE MyTable.MyKey = Sub_MyTable.MyKey 
); 

Jetzt denken Sie daran, die MAX (MyDate) und andere Verweise auf MyDate nicht tun, was Sie benötigen, wenn Sie das Feld in ein Datumsfeld drehen. Ich schlage vor, eine eigene Funktion zu erstellen, um das Zeichenfeld in ein Datumsfeld umzuwandeln.

Wenn Sie versuchen, nach dem MyDate-Feld zu sortieren, werden die Ergebnisse in alphabetischer Reihenfolge sortiert, da es sich um eine Zeichenfolge handelt.

Wenn der Zeitteil in den Ergebnissen wichtig ist, können Sie die beiden wie von @jeff vorgeschlagen kombinieren.

Verwandte Themen