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