¿Alguna vez te has encontrado con registros duplicados en tu base de datos de SQL Server? Los registros duplicados pueden causar problemas de precisión de datos y afectar el cumplimiento normativo. En este artículo, discutiremos las razones detrás de los registros duplicados y exploraremos formas de manejarlos y eliminarlos.
Razones de los registros duplicados
Existen dos razones principales para la duplicidad de datos:
- Falta de validación en una aplicación: Los registros duplicados pueden crearse cuando un usuario envía accidentalmente un formulario web varias veces o abre múltiples instancias de una página web.
- Diseño deficiente de la base de datos: Los registros duplicados también pueden ocurrir debido a un diseño deficiente de la base de datos, donde la base de datos carece de restricciones adecuadas.
Encontrar registros duplicados
Para identificar y analizar registros duplicados, podemos utilizar consultas SQL. Consideremos un escenario en el que tenemos una tabla sin una restricción de clave primaria o única. Podemos utilizar las siguientes consultas para crear una base de datos ficticia, crear una tabla e insertar algunos valores:
Crear base de datos Cumplimiento;
Ir;
crear tabla Cumplimiento_específico_Unidad_de_Negocio
(
ID_Cumplimiento varchar(50),
Nombre_Unidad_de_Negocio varchar(50),
Enviado_Por varchar(50),
Estado_Cumplimiento varchar(50),
Marca_de_Tiempo DateTime
)
Insertar en Cumplimiento_específico_Unidad_de_Negocio valores ('1001','Malden', 'sp\Luke', 'Completado',getdate())
Insertar en Cumplimiento_específico_Unidad_de_Negocio valores ('1001','Malden', 'sp\Luke', 'Completado',getdate())
Insertar en Cumplimiento_específico_Unidad_de_Negocio values ('1002','Cambridge', 'sp\Jane', 'Completado',getdate())
Insertar en Cumplimiento_específico_Unidad_de_Negocio values ('1003','Everet', 'sp\Liam', 'Pendiente',getdate())
Insertar en Cumplimiento_específico_Unidad_de_Negocio values ('1002','Cambridge', 'sp\Jane', 'Completado',getdate())
Insertar en Cumplimiento_específico_Unidad_de_Negocio values ('1002','Cambridge', 'sp\Jane', 'Completado',getdate())
Si revisamos la tabla, podemos ver que se han enviado registros duplicados por el mismo usuario con el mismo estado.
Usar agrupación para encontrar registros duplicados
Para encontrar registros duplicados, podemos utilizar las cláusulas GROUP BY y HAVING en SQL. La siguiente instrucción SELECT demuestra esto:
SELECT
A.ID_Cumplimiento
, Nombre_Unidad_de_Negocio
, Enviado_Por
, COUNT(*) AS Ocurrencia_Duplicada
FROM Cumplimiento_específico_Unidad_de_Negocio A
WHERE
ID_Cumplimiento = ID_Cumplimiento
AND Nombre_Unidad_de_Negocio = Nombre_Unidad_de_Negocio
AND Enviado_Por = Enviado_Por
GROUP BY
ID_Cumplimiento, Nombre_Unidad_de_Negocio, Enviado_Por
HAVING COUNT(ID_Cumplimiento) > 1;
Esta consulta devolverá los registros duplicados junto con el recuento de ocurrencias. Al analizar los resultados, podemos identificar los grupos duplicados.
Usar la función Row_Number() para encontrar filas duplicadas
La función Row_Number() se puede utilizar para asignar un número de fila único a cada fila en una tabla. Al particionar las filas en función de columnas específicas, podemos identificar filas duplicadas. Aquí tienes un ejemplo:
SELECT [ID_Cumplimiento],
[Nombre_Unidad_de_Negocio],
[Enviado_Por],
ROW_NUMBER() OVER(PARTITION BY [ID_Cumplimiento],
[Nombre_Unidad_de_Negocio],
[Enviado_Por]
ORDER BY [ID_Cumplimiento]) AS Ocurrencia_Duplicada
FROM [dbo].[Cumplimiento_específico_Unidad_de_Negocio]
Esta consulta devolverá las filas duplicadas con un número de fila diferente asignado a cada ocurrencia duplicada.
Eliminar registros duplicados
Para eliminar registros duplicados de una tabla de SQL Server, podemos utilizar una Expresión de Tabla Común (CTE) combinada con la función Row_Number(). Al eliminar los registros donde la Ocurrencia_Duplicada es mayor que 1, podemos limpiar las filas duplicadas. Aquí tienes un ejemplo:
WITH CTE([ID_Cumplimiento],
[Nombre_Unidad_de_Negocio],
[Enviado_Por],
Ocurrencia_Duplicada)
AS (SELECT [ID_Cumplimiento],
[Nombre_Unidad_de_Negocio],
[Enviado_Por],
ROW_NUMBER() OVER(PARTITION BY [ID_Cumplimiento],
[Nombre_Unidad_de_Negocio],
[Enviado_Por]
ORDER BY [ID_Cumplimiento]) AS Ocurrencia_Duplicada
FROM [dbo].[Cumplimiento_específico_Unidad_de_Negocio])
DELETE FROM CTE
WHERE Ocurrencia_Duplicada > 1;
Después de ejecutar esta consulta, la tabla solo contendrá filas únicas.
Conclusión
Limpiar registros duplicados de una base de datos de SQL Server puede ser una tarea que consume tiempo, pero es esencial para la precisión de los datos y el cumplimiento normativo. Mediante el uso de técnicas como ROW_NUMBER() y CTE, podemos identificar y eliminar registros duplicados de manera efectiva. Sin embargo, es importante probar y verificar el código en un entorno no productivo antes de implementarlo en un sistema en vivo.
Gracias por leer este artículo. Esperamos que te haya sido útil para manejar registros duplicados en SQL Server.