Cela fonctionne, essayez-le :
DELETE Customer_SCD
OUTPUT deleted.*
FROM Customer_SCD b
JOIN (
SELECT MIN(a.Customer_TimeStamp) Customer_TimeStamp,
Customer_ID,
Customer_Name
FROM Customer_SCD a
GROUP BY a.Customer_ID, a.Customer_Name
) c ON
c.Customer_ID = b.Customer_ID
AND c.Customer_Name = b.Customer_Name
AND c.Customer_TimeStamp <> b.Customer_TimeStamp
Dans une sous-requête, il détermine quel enregistrement est le premier pour chaque Customer_Name
,Customer_ID
puis il supprime tous les autres enregistrements pour un doublon. J'ai également ajouté le OUTPUT
clause qui renvoie les lignes affectées par l'instruction.
Vous pouvez également le faire en utilisant la fonction de classement ROW_NUMBER
:
DELETE Customer_SCD
OUTPUT deleted.*
FROM Customer_SCD b
JOIN (
SELECT Customer_ID,
Customer_Name,
Customer_TimeStamp,
ROW_NUMBER() OVER (PARTITION BY Customer_ID, Customer_Name ORDER BY Customer_TimeStamp) num
FROM Customer_SCD
) c ON
c.Customer_ID = b.Customer_ID
AND c.Customer_Name = b.Customer_Name
AND c.Customer_TimeStamp = b.Customer_TimeStamp
AND c.num <> 1
Voyez lequel a un coût de requête plus petit et utilisez-le, quand je l'ai vérifié, la première approche était plus efficace (elle avait un meilleur plan d'exécution).
Voici un SQL Fiddle