2013-07-06 7 views
18

La mia domanda:Eliminare i valori duplicati in base solo una colonna della tabella

SELECT sites.siteName, sites.siteIP, history.date 
FROM sites INNER JOIN 
    history ON sites.siteName = history.siteName 
ORDER BY siteName,date 

prima parte dell'output:

enter image description here

Come faccio a rimuovere i duplicati in siteName colonna? Voglio lasciare solo quello aggiornato basato sulla colonna date.

Nel risultato dell'esempio precedente, ho bisogno le righe 1, 3, 6, 10

risposta

20

Questo è dove la funzione finestra row_number() viene in aiuto:

SELECT s.siteName, s.siteIP, h.date 
FROM sites s INNER JOIN 
    (select h.*, row_number() over (partition by siteName order by date desc) as seqnum 
     from history h 
    ) h 
    ON s.siteName = h.siteName and seqnum = 1 
ORDER BY s.siteName, h.date 
+3

Potrebbe spiegare la query un po '? – JacksOnF1re

+5

@ JacksOnF1re. . . Sai cosa 'row_number()' fa? Enumera le righe in un gruppo (definito dalla clausola 'partition by'). L'ordine si basa sulla clausola 'order by'. Selezionando il valore di 1, viene selezionata una sola riga per gruppo, che sarà quella con la data più grande. –

7

dal vostro esempio sembra ragionevole supponiamo che la colonna siteIP sia determinata dalla colonna siteName (ovvero, ogni sito ha solo uno siteIP). Se questo è davvero il caso, allora c'è una soluzione semplice utilizzando group by:

select 
    sites.siteName, 
    sites.siteIP, 
    max(history.date) 
from sites 
inner join history on 
    sites.siteName=history.siteName 
group by 
    sites.siteName, 
    sites.siteIP 
order by 
    sites.siteName; 

Tuttavia, se la mia ipotesi non è corretta (vale a dire, è possibile che un sito per avere più siteIP), allora è non è chiaro da voi la domanda che volete che la query ritorni nella seconda colonna, siteIP. Se solo uno qualsiasi siteIP, farà la seguente query:

select 
    sites.siteName, 
    min(sites.siteIP), 
    max(history.date) 
from sites 
inner join history on 
    sites.siteName=history.siteName 
group by 
    sites.siteName 
order by 
    sites.siteName;