Sie zu denselben beitreten Tabelle auf den Feldern, die dupliziert werden und dann Anti-Join auf dem ID-Feld. Wählen Sie das ID-Feld aus dem ersten Tabellenalias (tn1) und verwenden Sie dann die Funktion array_agg für das ID-Feld des zweiten Tabellenalias. Damit die Funktion array_agg ordnungsgemäß funktioniert, gruppieren Sie die Ergebnisse nach dem Feld tn1.id. Dies erzeugt eine Ergebnismenge, die die ID eines Datensatzes und ein Array aller IDs enthält, die zu den Join-Bedingungen passen.
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;
Offensichtlich ids, die für eine ID in der duplicate_entries Array sein wird, wird auch ihre eigenen Einträge in der Ergebnismenge. Sie müssen diese Ergebnismenge verwenden, um zu entscheiden, welche ID zur Quelle der Wahrheit werden soll. Der einzige Datensatz, der nicht gelöscht werden sollte. Vielleicht könnten Sie etwas tun:
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)
Auswahl der niedrigsten Nummer ID, die Duplikate (vorausgesetzt, die ID int PK erhöht wird) haben. Dies wären die IDs, die Sie behalten würden.
möglich Duplikat [Finden Sie doppelte Zeilen mit PostgreSQL] (http://stackoverflow.com/questions/14471179/find-duplicate-rows-with-postgresql) – drs