Detta fungerar, prova det:
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
I en underfråga bestämmer den vilken post som är den första för varje Customer_Name
,Customer_ID
och sedan raderar den alla andra poster för en dubblett. Jag lade också till OUTPUT
sats som returnerar rader som påverkas av satsen.
Du kan också göra det genom att använda rankningsfunktionen 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
Se vilken som har en mindre frågekostnad och använd den, när jag kontrollerade den var den första metoden mer effektiv (den hade en bättre utförandeplan).
Här är en SQL-fiol