Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Doppelte Einträge mit unterschiedlichem Zeitstempel

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