Dette virker, prøv 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 underforespørgsel bestemmer den, hvilken post der er den første for hver Customer_Name
,Customer_ID
og så sletter den alle de andre poster for en dublet. Jeg tilføjede også OUTPUT
klausul, som returnerer rækker, der er påvirket af sætningen.
Du kan også gøre det ved at bruge rangeringsfunktionen 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 hvilken der har en mindre forespørgselsomkostning, og brug den, da jeg tjekkede den, var den første tilgang mere effektiv (den havde en bedre udførelsesplan).
Her er en SQL Fiddle