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

SQL:remover duplicatas


Um candidato de livro didático para a função de janela row_number():
;WITH x AS (
    SELECT unique_ID
          ,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
    FROM   tbl
    )
DELETE FROM tbl
FROM   x
WHERE  tbl.unique_ID = x.unique_ID
AND    x.rn > 1

Isso também cuida da situação em que um conjunto de dupes em (worker_ID,type_ID) compartilha a mesma date .
Veja a demonstração simplificada de em data.SE .

Atualize com uma versão mais simples


Acontece que isso pode ser simplificado:No SQL Server você pode excluir diretamente do CTE:
;WITH x AS (
    SELECT unique_ID
          ,row_number() OVER (PARTITION BY worker_ID,type_ID ORDER BY date) AS rn
    FROM   tbl
    )
DELETE x
WHERE  rn > 1