2010-09-23 42 views
12

Estoy usando postgres. Quiero eliminar filas duplicadas. La condición es que, 1 copia del conjunto de filas duplicadas no se eliminará.Eliminar filas duplicadas (no eliminar todas las duplicadas)

es decir: si hay 5 registros duplicados, se eliminarán 4 de ellos.

+1

posible duplicado de [Cómo eliminar filas duplicadas con SQL?] (Http://stackoverflow.com/questions/1173963/how-to-delete-duplicate-rows-with-sql) –

+1

cómo ¡irónico! lol 'posible duplicado de cómo eliminar duplicados' ... –

Respuesta

17

Pruebe los pasos descritos en este artículo: Removing duplicates from a PostgreSQL database.

Describe una situación en la que tiene que tratar con una gran cantidad de datos que no es posible en group by.

Una solución sencilla sería la siguiente:

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

Dónde hash es algo que se duplica.

+0

¿no elimina esto también todas las filas que no tienen duplicados? – pomarc

+0

@pomarc no, porque hay este pequeño signo igual (=) antes de 1 que nos dice que queremos tomar min (id) de todos los grupos posibles, incluso aquellos que solo contienen un miembro; entonces, no se preocupe, no borrará datos que no estén duplicados –

+0

es el tener conteo (*)> = 1 neccesario? obtuve el mismo resultado si ejecuto: ELIMINAR FROM foo WHERE id NOT IN (SELECCIONAR min (id) FROM foo GROUP BY hash) – grteibo

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

Esta es la elección aleatoria (Valor máximo) que fila debe conservar. Si tiene agregado con esto, proporcione más detalles

1

El más rápido es unirse a la misma tabla. 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) 
Cuestiones relacionadas