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