2010-09-23 3 views
12

Sto usando postgres. Voglio eliminare le righe duplicate. La condizione è che, 1 copia dal set di righe duplicate non verrebbe cancellata.Elimina righe duplicate (non cancella tutti i duplicati)

i.e: se ci sono 5 record duplicati, 4 di questi verranno eliminati.

+1

possibile duplicato di [Come eliminare le righe duplicate con SQL?] (Http://stackoverflow.com/questions/1173963/how-to-delete-duplicate-rows-with-sql) –

+1

come ironico! lol 'possibile duplicazione di come eliminare i duplicati' ... –

risposta

17

Provare i passaggi descritti in questo articolo: Removing duplicates from a PostgreSQL database.

Descrive una situazione in cui si ha a che fare con enormi quantità di dati che non è possibile a group by.

Una soluzione semplice sarebbe questo:

DELETE FROM foo 
     WHERE id NOT IN (SELECT min(id) --or max(id) 
         FROM foo 
         GROUP BY hash) 

Dove hash è qualcosa che viene duplicato.

+0

non elimina tutte le righe che non hanno duplicati? – pomarc

+0

@pomarc no, perché c'è questo piccolo segno di uguale (=) prima di 1 che ci dice che vogliamo prendere min (id) di tutti i gruppi possibili anche quelli che contengono un solo membro; quindi, non preoccuparti, non cancellerai i dati che non sono duplicati. –

+0

è il conteggio (*)> = 1 necessario? ho ottenuto lo stesso risultato se eseguo: DELETE FROM pippo DOVE id NON IN (SELEZIONA min (id) DA foo GROUP BY hash) – grteibo

2
delete from table 
where not id in 
(select max(id) from table group by [duplicate row]) 

Questa è una scelta casuale (valore massimo) quale riga è necessario conservare. Se si dispone di ulteriori dettagli, si prega di fornire ulteriori dettagli

1

Il più veloce è è unirsi alla stessa tabella. http://www.postgresql.org/docs/8.1/interactive/sql-delete.html

CREATE TABLE test(id INT,id2 INT); 
CREATE TABLE 
mapy=# INSERT INTO test VALUES(1,2); 
INSERT 0 1 
mapy=# INSERT INTO test VALUES(1,3); 
INSERT 0 1 
mapy=# INSERT INTO test VALUES(1,4); 
INSERT 0 1 

DELETE FROM test t1 USING test t2 WHERE t1.id=t2.id AND t1.id2<t2.id2; 
DELETE 2 
mapy=# SELECT * FROM test; 
id | id2 
----+----- 
    1 | 4 
(1 row)