Anda bisa bergabung ke tabel yang sama di bidang yang akan digandakan dan kemudian anti-bergabung di bidang id. Pilih bidang id dari alias tabel pertama (tn1) dan kemudian gunakan fungsi array_agg pada bidang id dari alias tabel kedua. Terakhir, agar fungsi array_agg berfungsi dengan baik, Anda akan mengelompokkan hasilnya berdasarkan bidang tn1.id. Ini akan menghasilkan set hasil yang berisi id dari catatan dan array dari semua id yang sesuai dengan kondisi gabungan.
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;
Jelas, id yang akan berada dalam array duplikat untuk satu id, juga akan memiliki entri mereka sendiri di set hasil. Anda harus menggunakan set hasil ini untuk memutuskan id mana yang Anda inginkan untuk menjadi sumber 'kebenaran'. Satu catatan yang tidak boleh dihapus. Mungkin Anda bisa melakukan sesuatu seperti ini:
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)
Memilih nomor ID terendah yang memiliki duplikat (dengan asumsi ID meningkat ke PK). Ini akan menjadi ID yang akan Anda simpan.