Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Voci duplicate con timestamp diverso

Funziona, provalo:

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 una sottoquery determina quale record è il primo per ogni Customer_Name ,Customer_ID e quindi elimina tutti gli altri record per un duplicato. Ho anche aggiunto il OUTPUT clausola che restituisce le righe interessate dall'istruzione.

Puoi anche farlo usando la funzione di ranking 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

Scopri quale ha un costo di query inferiore e usalo, quando l'ho verificato, il primo approccio è stato più efficiente (aveva un piano di esecuzione migliore).

Ecco un SQL Fiddle