मुझे ऐसा कोई उत्तर नहीं मिला जो सामान्य तालिका अभिव्यक्तियों और विंडो फ़ंक्शंस का उपयोग करता हो। यह वही है जिसके साथ मुझे काम करना सबसे आसान लगता है।
DELETE FROM
YourTable
WHERE
ROWID IN
(WITH Duplicates
AS (SELECT
ROWID RID,
ROW_NUMBER()
OVER(
PARTITION BY First_Name, Last_Name, Birth_Date)
AS RN
SUM(1)
OVER(
PARTITION BY First_Name, Last_Name, Birth_Date
ORDER BY ROWID ROWS BETWEEN UNBOUNDED PRECEDING
AND UNBOUNDED FOLLOWING)
AS CNT
FROM
YourTable
WHERE
Load_Date IS NULL)
SELECT
RID
FROM
duplicates
WHERE
RN > 1);
ध्यान देने योग्य बातें:
1) हम केवल विभाजन खंड में क्षेत्रों पर दोहराव के लिए जाँच कर रहे हैं।
2) यदि आपके पास दूसरों पर एक डुप्लिकेट लेने का कोई कारण है, तो आप उस क्रम से क्लॉज द्वारा एक ऑर्डर का उपयोग कर सकते हैं, जिसमें पंक्ति row_number () = 1 होगी
3) आप फाइनल में बदलकर संरक्षित नंबर डुप्लिकेट को बदल सकते हैं जहां N> = 1 के साथ "व्हेयर आरएन> एन" का क्लॉज है (मैं सोच रहा था कि एन = 0 डुप्लिकेट वाली सभी पंक्तियों को हटा देगा, लेकिन यह सिर्फ सभी पंक्तियों को हटा देगा) ।
4) सुमी विभाजन क्षेत्र को CTE क्वेरी जोड़ा गया जो समूह में संख्या पंक्तियों के साथ प्रत्येक पंक्ति को टैग करेगा। इसलिए डुप्लिकेट वाली पंक्तियों का चयन करने के लिए, जिसमें पहला आइटम "WHERE cnt> 1" शामिल है।