คุณสามารถเข้าร่วมในตารางเดียวกันในฟิลด์ที่จะทำซ้ำและต่อต้านการเข้าร่วมในฟิลด์ ID เลือกฟิลด์ id จากนามแฝงของตารางแรก (tn1) จากนั้นใช้ฟังก์ชัน array_agg บนฟิลด์ id ของนามแฝงตารางที่สอง ในที่สุดเพื่อให้ฟังก์ชัน array_agg ทำงานอย่างถูกต้องคุณจะจัดกลุ่มผลลัพธ์ตามฟิลด์ tn1.id สิ่งนี้จะสร้างชุดผลลัพธ์ที่มี id ของเร็กคอร์ดและอาร์เรย์ของ 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;
เห็นได้ชัดว่ารหัสที่จะอยู่ในอาเรย์ซ้ำซ้อนสำหรับรหัสเดียวก็จะมีรายการของตัวเองในชุดผลลัพธ์ คุณจะต้องใช้ชุดผลลัพธ์นี้เพื่อตัดสินใจว่า 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)
เลือก ID หมายเลขต่ำสุดที่มีซ้ำกัน (สมมติว่า ID กำลังเพิ่ม int PK) เหล่านี้จะเป็นรหัสที่คุณจะเก็บไว้รอบ ๆ