sql >> Base de Datos >  >> RDS >> Sqlserver

SQL Server 2008:eliminar filas duplicadas

Puedes DELETE de un cte:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

El ROW_NUMBER() función asigna un número a cada fila. PARTITION BY se usa para comenzar la numeración de cada elemento en ese grupo, en este caso cada valor de uniqueid comenzará a numerarse en 1 y subirá desde allí. ORDER BY determina en qué orden van los números. Dado que cada uniqueid se numera a partir del 1, cualquier registro con un ROW_NUMBER() mayor que 1 tiene un uniqueid duplicado

Para comprender cómo ROW_NUMBER() la función funciona, solo pruébela:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Puede ajustar la lógica del ROW_NUMBER() función para ajustar qué registro mantendrá o eliminará.

Por ejemplo, tal vez le gustaría hacer esto en varios pasos, primero eliminando registros con el mismo apellido pero diferentes nombres, podría agregar el apellido a la PARTITION BY :

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1