sql >> Base de Datos >  >> RDS >> Sqlserver

Entradas duplicadas con marca de tiempo diferente

Esto funciona, pruébalo:

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

En una subconsulta determina qué registro es el primero para cada Customer_Name ,Customer_ID y luego elimina todos los demás registros para un duplicado. También agregué la OUTPUT cláusula que devuelve las filas afectadas por la sentencia.

También puede hacerlo usando la función de clasificación 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

Vea cuál tiene un costo de consulta menor y utilícelo, cuando lo verifiqué, el primer enfoque fue más eficiente (tenía un mejor plan de ejecución).

Aquí hay un SQL Fiddle