PROBLEMA
Ieri sera avevo un piccolo problema e mi annoto qui la soluzione. Dovevo rimuovere delle righe duplicate da una tabella di persone importata da un foglio excel. La tabella aveva id, nome, cognome, indirizzo, email e altri dati sulla persona.
Si tratta in genere di un caso abbastanza comune in cui si vogliono rimuovere righe duplicate da una tabella, mantenendone però una (la prima o l’ultima come vedremo)
SOLUZIONE
Per pulire la tabella ho fatto l’ipotesi che nome e cognome fossero campi univoci e identificativi della riga, se a voi non bastano modificate la query aggiungendo altri campi.
Per prima cosa vediamo quante persone ho
select count(*) from model.persona
Risultato: 3806
Con la successiva query guardo quante righe dovrò cancellare. Notate che faccio sia la somma delle duplicazioni meno un count di tutti gli elementi (nome e cognome) che sono duplicati. Questo perché voglio sapere il numero esatto delle righe da cancellare.
select sum(A.c) - count(A.c) from (
select count(id) as c from model.persona group by cognome,nome having count(id)>1
) A
Il risultato è 279
Ora vediamo quante sono le righe che rimarranno nella tabella
select count(*) from model.persona where id not in
(
select min(id) from model.persona group by trim(’ ‘ from cognome),trim (’ ‘ from nome) –3527
)
Risultato 3527, che è appunto 3806 - 279.
Ora sapendo osa mi aspetto eseguo la query che pulisce i dati specificando di mantenere delle righe duplicate solo quella con id minore (vedi min(id)).
delete from model.persona where id not in
(
select min(id) from model.persona group by trim(’ ‘ from cognome),trim (’ ‘ from nome) –3527
)
Per sicurezza controllo non ci siano duplicati
select count(A.c) from (
select count(id) as c from model.persona group by cognome,nome having count(id)>1
) A
Risultato 0.