यह काम करता है, इसे आजमाएं:
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 Fiddle