Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Entradas duplicadas com carimbo de data/hora diferente


Isso funciona, tente:
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

Em uma subconsulta ele determina qual registro é o primeiro para cada Customer_Name ,Customer_ID e, em seguida, exclui todos os outros registros para uma duplicata. Eu também adicionei o OUTPUT cláusula que retorna linhas afetadas pela instrução.

Você também pode fazer isso usando a função de classificação 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

Veja qual tem um custo de consulta menor e use, quando verifiquei, a primeira abordagem foi mais eficiente (tinha um plano de execução melhor).

Aqui está um SQL Fiddle