2012-03-01 24 views
9

Sto scrivendo una query e ho utilizzato la soluzione in this thread e ha funzionato in qualche modo ma ho ancora un po 'di problemi.SQL: selezionare il record più recente quando c'è un duplicato

Voglio selezionare un gruppo di record che sono per la maggior parte unici, ma ce ne sono alcuni che si verificano due volte. Voglio essere in grado di selezionare solo il record che ha la data più recente. Questa è la mia interrogazione finora:

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) 

Questo funziona per quanto recupera l'ultimo record di quei record che hanno i duplicati, ma i record che non hanno duplicati non appare affatto.

Grazie per qualsiasi aiuto, e le mie scuse se ho perso qualcosa di super ovvio; Sono nuovo del gioco SQL.

+0

È possibile fornire dati di esempio di righe univoche che non vengono restituite rispetto a duplicati in cui sono corretti? – kaj

+0

Nota che ti sembra di partecipare alla data e non da altro, ad esempio id. È intenzionale? – kaj

+0

puoi essere più specifico? Hai detto: "Voglio essere in grado di selezionare solo il record che ha la nuova data" e quest'ultimo "ma quei dischi che NON hanno duplicati non appaiono affatto" ... mi sembrano due cose diverse. – Diego

risposta

17

Ci sono alcuni modi per farlo, in un modo è quello di utilizzare ROW_NUMBER come questo:

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 

Ciò restituirà la riga per ciascuna distinta id valore che ha l'ultima data.

+0

Grazie AdaTheDev, questo ha risolto il problema e sono riuscito a completare la query senza più duplicati! –

+0

Piccolo errore: tb2.Date dovrebbe essere tb1.Date – Vladimirs

Problemi correlati