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

Dublerede poster med forskelligt tidsstempel

Dette virker, prøv 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 underforespørgsel bestemmer den, hvilken post der er den første for hver Customer_Name ,Customer_ID og så sletter den alle de andre poster for en dublet. Jeg tilføjede også OUTPUT klausul, som returnerer rækker, der er påvirket af sætningen.

Du kan også gøre det ved at bruge rangeringsfunktionen 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 hvilken der har en mindre forespørgselsomkostning, og brug den, da jeg tjekkede den, var den første tilgang mere effektiv (den havde en bedre udførelsesplan).

Her er en SQL Fiddle



  1. ORACLE-forespørgsel med ORDER BY og UNION

  2. Hvorfor er denne INNER JOIN/ORDER BY mysql-forespørgsel så langsom?

  3. Henter grupperinger fra mange-til-mange tabeller

  4. Er der ulemper ved at bruge VARCHAR(MAX) i en tabel?