Một ứng cử viên sách giáo khoa cho hàm cửa sổ 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
Điều này cũng xử lý tình huống có một tập hợp các lỗi lừa đảo trên (worker_ID,type_ID)
chia sẻ cùng một date
.
Xem bản demo đơn giản về dữ liệu.SE .
Cập nhật với phiên bản đơn giản hơn
Hóa ra, điều này có thể được đơn giản hóa:Trong SQL Server, bạn có thể xóa trực tiếp khỏi 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