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