Điều này hoạt động, hãy thử nó:
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
Trong một truy vấn con, nó xác định bản ghi nào là bản ghi đầu tiên cho mỗi Customer_Name
, Customer_ID
và sau đó nó xóa tất cả các bản ghi khác để có bản sao. Tôi cũng đã thêm OUTPUT
mệnh đề trả về các hàng bị ảnh hưởng bởi câu lệnh.
Bạn cũng có thể làm điều đó bằng cách sử dụng hàm xếp hạng 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
Xem cái nào có chi phí truy vấn nhỏ hơn và sử dụng nó, khi tôi kiểm tra nó, cách tiếp cận đầu tiên hiệu quả hơn (nó có kế hoạch thực thi tốt hơn).
Đây là SQL Fiddle