आप उसी फ़ील्ड में उसी तालिका में शामिल हो सकते हैं जिसे डुप्लिकेट किया जाएगा और फिर आईडी फ़ील्ड पर एंटी-जॉइन किया जाएगा। पहली तालिका उपनाम (tn1) से आईडी फ़ील्ड का चयन करें और फिर दूसरी तालिका आईडी के आईडी फ़ील्ड पर array_agg फ़ंक्शन का उपयोग करें। अंत में, array_agg फ़ंक्शन को ठीक से काम करने के लिए, आप परिणाम को tn1.id फ़ील्ड द्वारा समूहित करेंगे। यह एक परिणाम सेट का उत्पादन करेगा जिसमें एक रिकॉर्ड की आईडी और सभी आईडी की एक सरणी होती है जो जुड़ने की स्थिति में फिट होती है।
select tn1.id,
array_agg(tn2.id) as duplicate_entries,
from table_name tn1 join table_name tn2 on
tn1.year = tn2.year
and tn1.sid = tn2.sid
and tn1.user_id = tn2.user_id
and tn1.cid = tn2.cid
and tn1.id <> tn2.id
group by tn1.id;
जाहिर है, आईडी जो एक आईडी के लिए डुप्लिकेट_एंट्रीज सरणी में होगी, परिणाम सेट में उनकी अपनी प्रविष्टियां भी होंगी। आपको इस परिणाम का उपयोग यह तय करने के लिए करना होगा कि आप किस आईडी से 'सत्य' का स्रोत बनना चाहते हैं। एक रिकॉर्ड जिसे हटाया नहीं जाना चाहिए। शायद आप ऐसा कुछ कर सकते हैं:
with dupe_set as (
select tn1.id,
array_agg(tn2.id) as duplicate_entries,
from table_name tn1 join table_name tn2 on
tn1.year = tn2.year
and tn1.sid = tn2.sid
and tn1.user_id = tn2.user_id
and tn1.cid = tn2.cid
and tn1.id <> tn2.id
group by tn1.id
order by tn1.id asc)
select ds.id from dupe_set ds where not exists
(select de from unnest(ds.duplicate_entries) as de where de < ds.id)
सबसे कम संख्या वाली आईडी का चयन करता है जिसमें डुप्लिकेट है (मान लिया गया है कि आईडी पीके बढ़ा रहा है)। ये वह आईडी होगी जिसे आप अपने आसपास रखेंगे।