Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

विभिन्न टाइमस्टैम्प के साथ डुप्लिकेट प्रविष्टियाँ

यह काम करता है, इसे आजमाएं:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. एसक्यूएल सर्वर डीबी में सभी इंडेक्स और इंडेक्स कॉलम की सूची

  2. SQL सर्वर varchar कॉलम से अजीब वर्ण (A टोपी के साथ) निकालें

  3. शून्य मानों के लिए पिछला मान कैसे प्राप्त करें

  4. किसी ISO स्वरूपित दिनांक को DATETIME में बदलें

  5. वेब-ऐप में रिपोर्टिंग सर्विसेज 2005 द्वारा कॉल किए जाने पर दूसरी टी-एसक्यूएल क्वेरी पहले की तुलना में बहुत तेज क्यों चलती है