Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL :supprimer les doublons

Un candidat manuel pour la fonction de fenêtre 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

Cela prend également en charge la situation où un ensemble de dupes sur (worker_ID,type_ID) partage la même date .
Voir la démo simplifiée sur data.SE .

Mettre à jour avec une version simplifiée

Il s'avère que cela peut être simplifié :dans SQL Server, vous pouvez supprimer directement du 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