Saltar al contenido

Guía para identificar y eliminar registros duplicados en SQL con ejemplos

Los registros duplicados en una base de datos pueden causar problemas al analizar y procesar información. En este artículo, te mostraremos cómo crear una tabla con registros duplicados y cómo utilizar diferentes técnicas en SQL para identificar y eliminar estas filas. A continuación, se presentan ejemplos prácticos que te ayudarán a comprender y aplicar estas técnicas.

Uno de los problemas mas complicados que tenemos en base de datos es cuando tienes duplicados , y necesitas eliminarlos. Si bien es cierto que existen varias formas de hacerlo, en este post te mostraremos las técnicas mas efectivas para lograrlo.

Índice

    Creación de una tabla con registros

    Primero, vamos a crear una tabla de ejemplo con filas. La tabla empleados tendrá las siguientes columnas: id_empleado, nombre, apellido y departamento.

    CREATE TABLE empleados (
      id_empleado INT,
      nombre VARCHAR(50),
      apellido VARCHAR(50),
      departamento VARCHAR(50)
    );
    
    INSERT INTO empleados (id_empleado, nombre, apellido, departamento)
    VALUES (1, 'Juan', 'Pérez', 'Ventas'),
           (2, 'Ana', 'García', 'Finanzas'),
           (3, 'Luis', 'Martínez', 'Marketing'),
           (4, 'Sofía', 'Rodríguez', 'Ventas'),
           (5, 'Juan', 'Pérez', 'Ventas');

    En este ejemplo, el registro con id_empleado 1 y el registro con id_empleado 5 tienen datos duplicados en las columnas nombre, apellido y departamento.

    Identificación de duplicados en SQL

    Para identificar los registros duplicados en la tabla empleados, utilizamos la instrucción SELECT con las cláusulas GROUP BY y HAVING:

    SELECT nombre, apellido, departamento, COUNT(*)
    FROM empleados
    GROUP BY nombre, apellido, departamento
    HAVING COUNT(*) > 1;

    Este ejemplo muestra los registros duplicados basados en las columnas nombre, apellido y departamento.

    Eliminación de filas duplicados utilizando ROW_NUMBER()

    Esta solucion implementa la funcion disponible para sql server la cual te permite enumerar las filas asignando un identificador unico a cada una de ellas.

    Para eliminar duplicados usando la función ROW_NUMBER(), sigue estos pasos:

    1. Utiliza la función ROW_NUMBER() en una consulta SELECT para asignar un número secuencial a cada fila dentro de una partición.
    2. Utiliza la consulta en un bloque WITH para crear una tabla derivada.
    3. Elimina los registros en función de la columna de números de fila.
    WITH tabla_cte AS (
      SELECT *, ROW_NUMBER() OVER (PARTITION BY nombre, apellido, departamento ORDER BY id_empleado) AS fila_numero
      FROM empleados
    )
    DELETE FROM tabla_cte
    WHERE fila_numero > 1;

    Este ejemplo elimina los registros duplicados basados en las columnas nombre, apellido y departamento. CTE o Comúnmente conocida como expresiones de tabla derivadas, se introdujo por primera vez en SQL SERVER 2005 y esta disponible a partir de entonces. Las CTEs son una construcción muy útil que mejora la legibilidad del código y hace que las consultas sean mucho más fáciles de escribir y leer.

    Eliminación de duplicados con la cláusula DELETE y JOIN

    Otra técnica es utilizar DELETE junto con JOIN. A continuación, se muestra un ejemplo:

    DELETE e1
    FROM empleados e1
    INNER JOIN empleados e2
    ON e1.nombre = e2.nombre AND e1.apellido = e2.apellido AND e1.departamento = e2.departamento
    WHERE e1.id_empleado < e2.id_empleado;
    

    En este ejemplo, se eliminan los duplicados basándose en las columnas `nombre’, apellido y departamento. La columna id_empleado se utiliza como criterio para decidir cuál de los registros duplicados debe eliminarse.

    Eliminación de mediante la recreación de la tabla

    Puedes eliminar las filas recreando la tabla sin las filas duplicadas. Para hacer esto, sigue estos pasos:

    1. Crea una tabla temporal con la misma estructura que la tabla original.
    2. Inserta en la tabla temporal los registros únicos de la tabla original.
    3. Elimina la tabla original.
    4. Renombra la tabla temporal con el nombre de la tabla original.

    Aquí tienes un ejemplo en SQL:

    -- Paso 1: Crear tabla temporal
    CREATE TABLE empleados_temporal AS
    SELECT DISTINCT * FROM empleados;
    
    -- Paso 2: Insertar registros únicos en la tabla temporal
    INSERT INTO empleados_temporal
    SELECT DISTINCT * FROM empleados;
    
    -- Paso 3: Eliminar tabla original
    DROP TABLE empleados;
    
    -- Paso 4: Renombrar tabla temporal
    ALTER TABLE empleados_temporal
    RENAME TO empleados;

    Este método es útil cuando se trata de una tabla con muchas columnas y no es práctico especificar todas las columnas para identificar registros duplicados.

    Clausula DELETE , WHERE HAVING de sql para eliminar duplicados

    La cláusula DELETE se utiliza para eliminar registros de una tabla en SQL. Sin embargo, no se puede combinar directamente con las cláusulas WHERE y HAVING para eliminar registros duplicados, ya que HAVING se utiliza junto con GROUP BY para filtrar los resultados de un conjunto de agregación.

    Para eliminarlos utilizando la cláusula DELETE, puedes utilizar una subconsulta en la cláusula WHERE en lugar de HAVING. Por ejemplo, si quieres eliminar registros duplicados basados en la columna columna1 en la tabla nombre_tabla, puedes seguir estos pasos:

    1. Escribe una consulta SELECT con GROUP BY y HAVING para identificar los valores duplicados en la columna columna1:
    SELECT columna1
    FROM nombre_tabla
    GROUP BY columna1
    HAVING COUNT(*) > 1;
    1. Utiliza esta consulta como subconsulta en la cláusula WHERE de la instrucción DELETE:
    DELETE FROM nombre_tabla
    WHERE columna1 IN (
      SELECT columna1
      FROM nombre_tabla
      GROUP BY columna1
      HAVING COUNT(*) > 1
    );

    Sin embargo, este enfoque eliminará todos los registros que tengan valores duplicados en la columna columna1, en lugar de conservar al menos uno de ellos.

    Para eliminarlos pero conservar al menos uno de ellos, puedes utilizar la cláusula DELETE junto con una subconsulta que emplee ROW_NUMBER() o la cláusula DELETE con JOIN, como se explicó en las respuestas anteriores. Estas técnicas te permitirán tener un mayor control sobre los registros que deseas eliminar y conservar.

    Recomendaciones para prevenir

    Para mantener la integridad de tus bases de datos y evitar la creación de registros duplicados en el futuro, te recomendamos seguir estas prácticas:

    1. Utiliza claves primarias y restricciones de unicidad: Asegúrate de que cada tabla tenga una clave primaria y, si es necesario, utiliza restricciones de unicidad en otras columnas para prevenir la inserción de registros duplicados.
    2. Realiza validaciones en la aplicación: Implementa validaciones en tu aplicación para garantizar que se ingresen datos correctos y sin duplicados antes de insertarlos en la base de datos.
    3. Crea procedimientos almacenados para insertar datos: Utiliza procedimientos almacenados para centralizar y controlar el proceso de inserción de registros en la base de datos.

    Preguntas frecuentes sobre la eliminación de registros duplicados en SQL

    1. ¿Cómo puedo identificar registros duplicados en SQL?
      • Puedes utilizar la instrucción SELECT con las cláusulas GROUP BY y HAVING para identificar registros duplicados en función de las columnas de interés.
      • Por ejemplo:
        • SELECT columna1, columna2, COUNT(*) FROM nombre_tabla GROUP BY columna1, columna2 HAVING COUNT(*) > 1;
    2. ¿Cuál es la diferencia entre ROW_NUMBER(), RANK() y DENSE_RANK()?ROW_NUMBER(), RANK() y DENSE_RANK() son funciones analíticas en SQL que asignan números a las filas dentro de un conjunto de resultados. La principal diferencia es cómo tratan las filas con valores idénticos:
      • ROW_NUMBER(): Asigna un número único a cada fila, independientemente de los valores duplicados.
      • RANK(): Asigna el mismo número a las filas con valores idénticos y deja un hueco en los números de fila.
      • DENSE_RANK(): Asigna el mismo número a las filas con valores idénticos y no deja huecos en los números de fila.
    3. ¿Cómo puedo prevenir la inserción de registros duplicados en SQL?
      • Puedes prevenir la inserción de registros duplicados utilizando claves primarias y restricciones de unicidad en las columnas relevantes. También es importante realizar validaciones en la aplicación antes de insertar datos en la base de datos y utilizar procedimientos almacenados para centralizar y controlar el proceso de inserción de registros.
    4. ¿Qué método debo utilizar para eliminar registros duplicados en SQL?
      • El método más adecuado para eliminar registros duplicados en SQL dependerá de tus necesidades y de la estructura de la tabla. ROW_NUMBER() es una opción eficiente y flexible, pero también puedes utilizar DELETE con JOIN o recrear la tabla si es más conveniente para tu caso específico.
    5. ¿Cómo puedo eliminar registros duplicados en función de una sola columna?
      • Si deseas eliminar registros duplicados en función de una sola columna, puedes utilizar una consulta similar a la siguiente:
        • WITH tabla_cte AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY columna1 ORDER BY columna2) AS fila_numero FROM nombre_tabla ) DELETE FROM tabla_cte WHERE fila_numero > 1;
      • En este ejemplo, se eliminan los registros duplicados basándose en la columna columna1, y la columna columna2 se utiliza para determinar el orden en que se asignan los números de fila.

    Conclusión

    Hemos mostrado cómo crear una tabla con registros duplicados y cómo utilizar diferentes técnicas en SQL para identificar y eliminar estos registros. Implementa estas técnicas y prácticas en tus proyectos para asegurarte de que tus bases de datos estén siempre libres de duplicados.

    En resumen conclusion los registros duplicados son un gran problema a la hora de manipular datos y si no se tienen en cuenta puede ocasionar perdidas de informacion importante. Es importante resaltar que esto también funciona para no mostrar registros duplicados mysql.

    Descargar script consultas valores duplicados

    Aqui tambien dejamos un script para que puedas crear tu escenario de prueba y validar las tecnicas para eliminar registros duplicados.

    Analicemos con atencion los datos y utilicemos las herramientas adecuadas para manejarlos.

    Ver mas ejemplos

    Hasta la Proxima!!

    Bye :D!!