これは機能します。試してみてください。
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
サブクエリでは、どのレコードがすべての最初のレコードであるかを判別しCustomer_Name
、Customer_ID
次に、重複する他のすべてのレコードを削除します。OUTPUT
また、ステートメントの影響を受ける行を返す句を追加しました。
ランキング機能を使用してそれを行うこともできます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
どちらがクエリコストが小さいかを確認して使用します。確認したところ、最初のアプローチの方が効率的でした(実行プランが優れていました)。
これがSQLフィドルです