2012-03-01 14 views
9

Piszę zapytanie, i użyłem rozwiązania w this thread i działało nieco, ale wciąż mam trochę problemów.SQL - Wybierz najnowszy rekord, gdy istnieje duplikat

Chcę wybrać kilka rekordów, które są w większości unikatowe, ale istnieje kilka, które występują dwa razy. Chcę móc wybrać tylko rekord, który ma najnowszą datę. To jest mój kwerendy do tej pory:

SELECT tb1.id,tb1.type,tb1.date 

FROM Table tb1 

WHERE tb1.type = 'A' OR 'B' 
AND tb1.date = (SELECT TOP 1 tb2.date 
       FROM Table tb2 
       WHERE tb2.date = tb1.date 
       ORDER BY tb2.date DESC) 

Działa to tak daleko, jak to pobiera najnowszą płytę tych zapisów, które mają duplikaty, ale te zapisy, które nie mają duplikaty nie pojawiają się w ogóle.

Dziękuję za pomoc i przepraszam, jeśli przegapiłem coś bardzo oczywistego; Jestem nowy w grze SQL.

+0

Czy możesz podać przykładowe dane dotyczące unikalnych wierszy, które nie są zwracane w porównaniu do duplikatów, w których są prawidłowe? – kaj

+0

Zwróć uwagę, że pojawiasz się przy dołączaniu daty, a nie przez nic innego, np. Id. Czy to jest zamierzone? – kaj

+0

możesz być bardziej konkretny? Powiedziałeś: "Chcę móc wybrać tylko rekord, który ma najnowszą datę" i ostatnią ", ale te rekordy, które NIE mają duplikatów, wcale się nie pojawiają" ... wydaje mi się, że to dwie różne rzeczy. – Diego

Odpowiedz

17

Istnieje kilka sposobów, aby to zrobić, jednym ze sposobów jest użycie ROW_NUMBER takiego:

SELECT id, type, date 
FROM 
(
    SELECT tb1.id, tb1.type, tb1.Date, 
     ROW_NUMBER() OVER (PARTITION BY tb1.id ORDER BY tb1.Date DESC) AS RowNo 
    FROM Table tb1 
    WHERE tb1.type IN ('A','B') 
) x 
WHERE x.RowNo = 1 

ta zwróci wiersz dla każdy odrębny id wartość, która ma ostateczny termin.

+0

Dzięki AdaTheDev, to rozwiązało problem i udało mi się ukończyć zapytanie bez żadnych duplikatów! –

+0

Mała literówka: tb2.Data powinna wynosić tb1.Data – Vladimirs

Powiązane problemy