sql >> Databáze >  >> RDS >> Sqlserver

Duplicitní záznamy s jiným časovým razítkem

Funguje to, zkuste to:

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

V dílčím dotazu určuje, který záznam je první pro každý Customer_Name ,Customer_ID a poté odstraní všechny ostatní záznamy pro duplikát. Také jsem přidal OUTPUT klauzule, která vrací řádky ovlivněné příkazem.

Můžete to udělat také pomocí funkce hodnocení 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

Podívejte se, který z nich má nižší náklady na dotaz, a použijte jej. Když jsem to zkontroloval, první přístup byl efektivnější (měl lepší plán provádění).

Zde je SQL Fiddle



  1. ORA-00904 neplatný identifikátor na dekódovacím aliasu

  2. Jak vrátím pole jsonb a pole objektů z mých dat?

  3. Vytvoření pole z tabulky MySQL

  4. PDO vloží jednoduché pole do databáze MySQL