Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Entrées en double avec un horodatage différent

Cela fonctionne, essayez-le :

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

Dans une sous-requête, il détermine quel enregistrement est le premier pour chaque Customer_Name ,Customer_ID puis il supprime tous les autres enregistrements pour un doublon. J'ai également ajouté le OUTPUT clause qui renvoie les lignes affectées par l'instruction.

Vous pouvez également le faire en utilisant la fonction de classement 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

Voyez lequel a un coût de requête plus petit et utilisez-le, quand je l'ai vérifié, la première approche était plus efficace (elle avait un meilleur plan d'exécution).

Voici un SQL Fiddle