2013-08-23 10 views
9

Mam tabeli jak poniżej:SQL Server Wybór rekordów z najnowszymi czas data

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 

Uwaga Format MyDate że będzie YYMMDD i MyTime jest w formacie 24-godzinnym.

Chcę zwrócić wynik wyjątkowego MyKey z najnowszymi MyDate i MyTime. Oczekiwany wynik będzie następujący:

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

Każda pomoc będzie doceniana. Dzięki.

+0

Jakie są typy danych 'MyDate' i' MyTime'? A dlaczego nie używasz wbudowanych typów danych dla dat i czasów? –

+0

Obecnie są int i nchar. Jednak nie ma to znaczenia, ponieważ zaimportowałem te dane z pliku csv i mogę zdefiniować dla nich dowolny typ danych. – user2709309

+0

Możliwy duplikat [Serwer SQL: WYBIERZ tylko wiersze z MAX (DATE)] (https://stackoverflow.com/questions/7118170/sql-server-select-only-therow-with-maxdate) – Vadzim

Odpowiedz

5

Najpierw połącz kolumny daty i czasu z datetime, aby łatwo je zamówić. Minęło trochę czasu odkąd użyłem serwera Sql, ale funkcja row_number() i partycjonowanie to łatwy sposób na znalezienie maksimum jednej kolumny zgrupowanej przez inną - klauzula partycji jest podobna do grupy przez.

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

Po pierwsze, należy przekonwertować datę char na pole daty, aby można było przez niego zamawiać. Więc co można zrobić, to:

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

Teraz pamiętać, MAX (MyDate) i inne odniesienia do MyDate nie zrobi to, czego wymagają chyba włączeniu pola na pole daty. Proponuję utworzyć własną funkcję, aby przekonwertować pole char w pole daty.

Jeśli spróbujesz zamówić za pomocą pola MyDate w obecnej postaci, wyniki będą posortowane w kolejności alfabetycznej, ponieważ są ciągiem.

Jeśli część czasu jest ważna w wynikach, możesz połączyć te dwie wartości zgodnie z sugestią @jeff.