Tengo una tabla en una base de datos PostgreSQL 8.3.8, que no tiene claves / restricciones y tiene varias filas con exactamente los mismos valores.
Me gustaría eliminar todos los duplicados y conservar solo 1 copia de cada fila.
Hay una columna en particular (denominada "clave") que se puede utilizar para identificar duplicados (es decir, solo debe existir una entrada para cada "clave" distinta).
¿Cómo puedo hacer esto? (idealmente con un solo comando SQL) La velocidad no es un problema en este caso (solo hay unas pocas filas).
sql
postgresql
duplicates
André Morujão
fuente
fuente
Una solución más rápida es
fuente
ctid
?Esto es rápido y conciso:
Vea también mi respuesta en Cómo eliminar filas duplicadas sin un identificador único que incluye más información.
fuente
ctid
apunta a la ubicación física del registro en la tabla. Al contrario de lo que escribí en ese momento en el comentario, el uso del operador menor que no necesariamente apunta a la versión anterior, ya que ct puede ajustarse y un valor con un ctid más bajo podría ser más nuevo.min(ctid)
? mientras que el tuyo se queda con los más nuevos? ¡Gracias!Probé esto:
proporcionado por Postgres wiki:
https://wiki.postgresql.org/wiki/Deleting_duplicates
fuente
id
incluidas.id
donde la columna1 ... 3 están duplicadasTuve que crear mi propia versión. La versión escrita por @a_horse_with_no_name es demasiado lenta en mi mesa (21M filas). Y @rapimo simplemente no borra dups.
Esto es lo que uso en PostgreSQL 9.5
fuente
Usaría una tabla temporal:
Luego, elimine
tab
y cambie el nombretab_temp
atab
.fuente
DROP TABLE IF EXISTS tmp; CREATE TABLE tmp as ( SELECT * from (SELECT DISTINCT * FROM your_table) as t ); DELETE from your_table; INSERT INTO your_table SELECT * from tmp; DROP TABLE tmp;
Otro enfoque (funciona solo si tiene un campo único como
id
en su tabla) para encontrar todos los identificadores únicos por columnas y eliminar otros identificadores que no están en la lista únicafuente
Qué tal si:
Me había preocupado la orden de ejecución, si el DELETE ocurriría antes del SELECT DISTINCT, pero funciona bien para mí. Y tiene la ventaja adicional de no necesitar ningún conocimiento sobre la estructura de la tabla.
fuente
json
), esto no funcionará.Esto funcionó bien para mí. Tenía una tabla, términos, que contenía valores duplicados. Ejecutó una consulta para completar una tabla temporal con todas las filas duplicadas. Luego ejecuté una declaración de eliminación con esos identificadores en la tabla temporal. valor es la columna que contenía los duplicados.
fuente
Aquí hay una solución usando
PARTITION BY
:fuente