sql >> Databasteknik >  >> RDS >> Sqlserver

Dubblettposter med olika tidsstämpel

Detta fungerar, prova 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 underfråga bestämmer den vilken post som är den första för varje Customer_Name ,Customer_ID och sedan raderar den alla andra poster för en dubblett. Jag lade också till OUTPUT sats som returnerar rader som påverkas av satsen.

Du kan också göra det genom att använda rankningsfunktionen 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 vilken som har en mindre frågekostnad och använd den, när jag kontrollerade den var den första metoden mer effektiv (den hade en bättre utförandeplan).

Här är en SQL-fiol



  1. Hur tar man prov på rader i MySQL med RAND(seed)?

  2. Arbetar med INTERVAL och CURDATE i MySQL

  3. Hur man säkerhetskopierar MySQL med MySQL arbetsbänk automatiskt

  4. mysql-fråga för länkad lista