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() का उपयोग करना आसान हो जाता है। यदि कोई उचित एक्सेस इंडेक्स मौजूद नहीं है तो प्रदर्शन अभी भी समस्याग्रस्त हो सकता है।