En lärobokskandidat för fönsterfunktionen 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
Detta tar också hand om situationen där en uppsättning duperingar på (worker_ID,type_ID)
delar samma date
.
Se den förenklade demon på data.SE .
Uppdatera med enklare version
Det visar sig att detta kan förenklas:I SQL Server kan du ta bort från CTE direkt:
;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