Кандидат за учебник за прозоречната функция 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
Това също така се грижи за ситуацията, при която набор от дупки на (worker_ID,type_ID)
споделя една и съща date
.
Вижте опростената демо на data.SE .
Актуализирайте с по-проста версия
Оказва се, че това може да бъде опростено:В SQL Server можете да изтриете директно от 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