Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL:Duplikate entfernen

Ein Lehrbuchkandidat für die Fensterfunktion 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

Dies kümmert sich auch um die Situation, in der eine Reihe von Duplikaten auf (worker_ID,type_ID) hat dasselbe date .
Sehen Sie sich die vereinfachte Demo auf data.SE .

Update mit einfacherer Version

Es stellt sich heraus, dass dies vereinfacht werden kann:In SQL Server können Sie direkt aus dem CTE löschen:

;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