2013-04-10 13 views
6

Mam bardzo prostą tabelę (dla celów demonstracyjnych)Czy mogę poprawić to zapytanie?

CREATE TABLE t1 (id int,d1 date); 

i tej kwerendy.

SELECT 
    A.id, 
    minA, 
    minB 
FROM (SELECT id, MIN(d1) AS minA 
    FROM t1 
    GROUP BY id) AS A 
    LEFT JOIN (SELECT C.id, MIN(C.d1) AS minB 
     FROM t1 AS C 
     INNER JOIN (SELECT id, MIN(d1) AS minD 
      FROM t1 
      GROUP BY id) AS D ON C.id = D.id AND C.d1 > D.minD 
     GROUP BY C.id) AS B ON A.id = B.id 

SQL Fiddle link here

Zasadniczo staram się uzyskać dwa „dolna” wartości dat dla każdego identyfikatora w rzędzie, z wartością null, jeśli istnieje tylko jeden termin ID. Powyższe zapytanie działa, ale musi być lepszy/czysty sposób, aby to zrobić, którego po prostu nie widzę. Używam programu SQL Server 2008, jeśli to ma znaczenie.

Odpowiedz

18

Można użyć row_number() dostać najstarszym dwie daty, a następnie odchyl danych w kolumnach za pomocą funkcji zagregowanego z CASE:

select id, 
    max(case when rn = 1 then d1 end) MinA, 
    max(case when rn = 2 then d1 end) MinB 
from 
(
    select id, 
    d1, 
    row_number() over(partition by id order by d1) rn 
    from t1 
) src 
where rn < 3 
group by id; 

Zobacz SQL Fiddle with Demo.

Albo można użyć funkcji PIVOT aby włączyć date wierszy do kolumn:

select id, 
    [1] MinA, 
    [2] MinB 
from 
(
    select id, 
    d1, 
    row_number() over(partition by id order by d1) rn 
    from t1 
) src 
pivot 
(
    max(d1) 
    for rn in ([1], [2]) 
) piv; 

Zobacz SQL Fiddle with Demo

+0

próbowałem robić coś bardzo podobnego, ale z jakiegoś powodu moja pivot zmusiło mnie do końca się z nimi wiersze dla każdego identyfikatora. Wiersz 1 miałby identyfikator i pierwszą datę (druga data byłaby zerowa), a wiersz 2 miałby identyfikator i drugą datę (pierwsza kolumna null). Dzięki za to rozwiązanie! – Crag

+0

@Crag Jesteś mile widziany, cieszę się, że zadziałało. – Taryn

+4

@YatinSaraiya: Jeśli nie możesz bronić swojego punktu, nie ma to większego znaczenia. – Ryan

Powiązane problemy