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

SQL क्वेरी - यदि 3 से अधिक डुप्लिकेट हैं तो डुप्लिकेट हटाएं?

with cte as (
  select row_number() over (partition by dupcol1, dupcol2 order by ID) as rn
     from table)
delete from cte
   where rn > 2; -- or >3 etc

क्वेरी प्रत्येक रिकॉर्ड के लिए 'पंक्ति संख्या' का निर्माण कर रही है, जिसे (dupcol1, dupcol2) द्वारा समूहीकृत किया गया है और आईडी द्वारा आदेश दिया गया है। वास्तव में यह पंक्ति संख्या 'डुप्लिकेट' की गणना करती है जिसमें समान dupcol1 और dupcol2 होते हैं और फिर नंबर 1, 2, 3 असाइन करते हैं। एन, आईडी द्वारा क्रम। अगर आप सिर्फ 2 'डुप्लिकेट' रखना चाहते हैं, तो आपको उन नंबरों को हटाना होगा जिन्हें 3,4,.. N नंबर दिए गए थे। और यह वह हिस्सा है जिसका DELLETE.. WHERE rn > 2; द्वारा ध्यान रखा जाता है

इस पद्धति का उपयोग करके आप ORDER BY बदल सकते हैं अपने पसंदीदा आदेश के अनुरूप (उदाहरण के लिए।ORDER BY ID DESC ), ताकि LATEST इसमें rn=1 है , तो नवीनतम के बाद अगला है rn=2 और इसी तरह। बाकी वही रहता है, DELETE केवल सबसे पुराने लोगों को हटा देगा क्योंकि उनके पास उच्चतम पंक्ति संख्याएं हैं।

इसके विपरीत -an/1175205#1175205">यह निकट से संबंधित प्रश्न , जैसे-जैसे स्थिति अधिक जटिल होती जाती है, CTE और row_number() का उपयोग करना आसान हो जाता है। यदि कोई उचित एक्सेस इंडेक्स मौजूद नहीं है तो प्रदर्शन अभी भी समस्याग्रस्त हो सकता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_VALUE () SQL सर्वर में उदाहरण (T-SQL)

  2. SQL सर्वर प्रतिस्थापन () बनाम अनुवाद ():अंतर क्या हैं?

  3. Inno सेटअप का उपयोग करके MS SQL सर्वर से कैसे कनेक्ट करें?

  4. SQL सर्वर में PARSE() बनाम TRY_PARSE():क्या अंतर है?

  5. SYSUTCDATETIME () SQL सर्वर में उदाहरण (T-SQL)