Eliminar duplicados de forma segura
Elimine filas duplicadas exactas y aproximadas conservando un único registro canónico
Eliminar duplicados de forma segura es una lección gratuita de SQL Interview Prep en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Interview Prep, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Interview Prep incluye 4 lecciones en total.
El problema de la deduplicación
«Esta tabla tiene filas duplicadas. Elimínelas, pero conserve una copia de cada una». Casi todas las entrevistas de ingeniería de datos incluyen alguna variante de este problema. El desafío consiste en hacerlo de forma segura: conservar exactamente una fila canónica y no eliminar accidentalmente registros distintos que solo parecen similares.
Veremos cómo detectar duplicados, elegir qué copia conservar, deduplicar en un SELECT y eliminar físicamente los duplicados de una tabla.
Defina primero qué es un duplicado
La primera pregunta que debe hacer a la persona entrevistadora es: «¿Qué hace que dos filas sean duplicadas?» Algunas opciones son:
- Duplicados exactos: todas las columnas son idénticas.
- Duplicados por clave: tienen la misma clave de negocio (por ejemplo, el mismo
email), pero las demás columnas pueden diferir.
La técnica es diferente en cada caso. Nunca lo dé por supuesto: aclarar la definición de duplicado es el paso más importante y se espera que haga esa pregunta.
Detección de duplicados
Para encontrar claves duplicadas, agrupe por las columnas que definen un duplicado y conserve los grupos cuyo recuento sea superior a uno. Así sabrá qué claves están afectadas y cuántas copias existen antes de modificar nada.
Ejecutar primero una consulta de detección es una buena práctica que conviene mencionar: permite verificar la magnitud del problema antes de eliminar datos.
SELECT email, COUNT(*) AS copies
FROM users
GROUP BY email
HAVING COUNT(*) > 1
ORDER BY copies DESC;Duplicados exactos: DISTINCT
Si los duplicados son realmente idénticos en todas las columnas, una vista deduplicada de solo lectura se obtiene simplemente con SELECT DISTINCT *. UNION (sin ALL) también elimina las filas duplicadas.
Sin embargo, DISTINCT solo sirve cuando desea deduplicar la fila completa y no necesita elegir qué copia conservar. En el caso de duplicados por clave cuyas columnas difieren, necesita aplicar una clasificación.
-- Read-only dedup of exact-duplicate rows
SELECT DISTINCT customer_id, name, signup_date
FROM customers;Duplicados por clave: ROW_NUMBER
Cuando varias filas comparten una clave, pero difieren en otras columnas, divídalas en particiones por clave y numere cada copia. rn = 1 identifica la fila que conservará; rn > 1 identifica las copias adicionales que debe descartar.
El ORDER BY dentro de la ventana decide qué copia es la canónica. Elíjalo deliberadamente; por ejemplo, puede conservar la fila actualizada más recientemente.
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY updated_at DESC
) AS rn
FROM users;Selección de la copia canónica
Incluya la numeración en una CTE y conserve únicamente rn = 1. Esto devuelve una fila por clave: concretamente, la fila que su ORDER BY clasificó en primer lugar.
Esta forma de SELECT no modifica los datos: es perfecta para crear una vista limpia o alimentar un INSERT ... SELECT hacia una tabla de destino deduplicada sin tocar el origen.
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY email ORDER BY updated_at DESC
) AS rn
FROM users
)
SELECT user_id, email, name, updated_at
FROM ranked
WHERE rn = 1;La elección del orden importa
El ORDER BY dentro de la partición es una decisión de negocio, no una formalidad:
ORDER BY updated_at DESCconserva el registro más reciente.ORDER BY created_at ASCconserva el original.ORDER BY id ASCconserva la clave sustituta más baja, lo que resulta útil como elección arbitraria estable.
Añada un criterio de desempate único para que la fila elegida sea determinista cuando también haya empate en la columna de ordenación principal.
ROW_NUMBER() OVER (
PARTITION BY email
ORDER BY updated_at DESC, id ASC
) AS rnEliminación física de duplicados
Para eliminar realmente los duplicados de la tabla, identifique las filas adicionales (rn > 1) y elimínelas. En Postgres y SQL Server puede eliminar filas usando una CTE; en MySQL es habitual usar una autocombinación o una subconsulta.
Ejecute siempre primero el SELECT correspondiente para previsualizar exactamente qué filas desaparecerán. Eliminar a ciegas es la forma de fallar esta pregunta.
WITH ranked AS (
SELECT ctid,
ROW_NUMBER() OVER (
PARTITION BY email ORDER BY updated_at DESC, id ASC
) AS rn
FROM users
)
DELETE FROM users
WHERE ctid IN (SELECT ctid FROM ranked WHERE rn > 1);El patrón de eliminación con autocombinación
Un enfoque clásico y portable conserva la fila con el id más pequeño de cada clave duplicada y elimina las demás mediante una autocombinación. No necesita funciones de ventana, algo importante en motores antiguos.
La condición de combinación empareja cada fila con otra que comparte la misma clave, pero tiene un id menor; cualquier fila que tenga un gemelo con un id menor es un duplicado que debe eliminarse.
DELETE u1
FROM users u1
JOIN users u2
ON u1.email = u2.email
AND u1.id > u2.id;Lista de comprobación de seguridad
Antes de eliminar, protéjase:
- Incluya la eliminación en una transacción para poder hacer
ROLLBACKsi el recuento no es el esperado. - Ejecute primero
SELECT COUNT(*)sobre las filas que se eliminarán y compruebe que el resultado sea razonable. - Considere crear una tabla de respaldo:
CREATE TABLE users_bak AS SELECT * FROM users. - Confirme que las columnas de
PARTITION BYrealmente definen un duplicado; de lo contrario, podría eliminar registros distintos.
BEGIN;
-- run the DELETE, inspect row count
-- COMMIT; if correct, otherwise ROLLBACK;Casi duplicados y normalización
A veces las filas no son exactamente iguales, pero desde el punto de vista lógico representan lo mismo: 'Ann@X.com' frente a 'ann@x.com', o espacios finales. Cree la partición a partir de una expresión normalizada, no de la columna sin transformar.
Mencionar la normalización demuestra experiencia: en el mundo real, los duplicados suelen ocultarse tras diferencias de mayúsculas y minúsculas, espacios en blanco o formato que una comparación de claves ingenua no detecta.
ROW_NUMBER() OVER (
PARTITION BY LOWER(TRIM(email))
ORDER BY updated_at DESC, id ASC
) AS rnComprobación rápida
Elija el enfoque seguro para la deduplicación.
Resumen: deduplicación segura
Deduplicate de forma metódica:
- Primero defina qué es un duplicado y después detecte los casos con GROUP BY / HAVING COUNT(*) > 1.
- Duplicados exactos →
DISTINCT. Duplicados por clave →ROW_NUMBERparticionado por la clave; conservern = 1. - El
ORDER BYde la ventana elige la copia canónica; añada un criterio de desempate único. - Elimine las filas
rn > 1dentro de una transacción después de previsualizar el recuento. - Normalice las claves para detectar casi duplicados.
Preguntas frecuentes
¿La lección «Eliminar duplicados de forma segura» es gratis?
Sí — el texto completo de «Eliminar duplicados de forma segura» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Interview Prep, actualiza a CoddyKit PRO. El curso de SQL Interview Prep incluye 4 lecciones en total.
¿Qué aprenderé en «Eliminar duplicados de forma segura»?
Elimine filas duplicadas exactas y aproximadas conservando un único registro canónico Practicas SQL Interview Prep con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Interview Prep?
No se requiere experiencia previa. SQL Interview Prep en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Eliminar duplicados de forma segura»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Interview Prep?
Sí. Cada lección de SQL Interview Prep incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Filas superiores por grupo con ROW_NUMBER
- Gestionar empates en los valores superiores
- Eliminar duplicados de forma segura
- Conservar la última fila por clave