Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

SQL Server 2008:excluir linhas duplicadas


Você pode DELETE de um cte:
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

O ROW_NUMBER() função atribui um número a cada linha. PARTITION BY é usado para iniciar a numeração para cada item desse grupo, neste caso cada valor de uniqueid começará a numerar em 1 e subirá a partir daí. ORDER BY determina em qual ordem os números vão. Como cada uniqueid é numerado a partir de 1, qualquer registro com um ROW_NUMBER() maior que 1 tem um uniqueid duplicado

Para entender como o ROW_NUMBER() função funciona, apenas experimente:
SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Você pode ajustar a lógica do ROW_NUMBER() função para ajustar qual registro você manterá ou removerá.

Por exemplo, talvez você queira fazer isso em várias etapas, primeiro excluindo registros com o mesmo sobrenome, mas nomes diferentes, você pode adicionar sobrenome ao 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