Das funktioniert, versuchen Sie es:
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
In einer Unterabfrage wird ermittelt, welcher Datensatz für jeden Customer_Name
der erste ist ,Customer_ID
und dann löscht es alle anderen Datensätze für ein Duplikat. Ich habe auch den OUTPUT
hinzugefügt -Klausel, die Zeilen zurückgibt, die von der Anweisung betroffen sind.
Sie können dies auch mit der Ranking-Funktion ROW_NUMBER
tun :
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
Sehen Sie, welche Abfragekosten geringer sind, und verwenden Sie sie. Als ich sie überprüfte, war der erste Ansatz effizienter (sie hatte einen besseren Ausführungsplan).
Hier ist eine SQL-Fiddle