在 Postgres 中删除具有重复字段的行

时间:2021-06-25 14:04:14

标签: sql postgresql

我有一个数据库(表名是campaign_eventfire),其中包含联系人的重复事件,我想删除所有重复事件,以便每个联系人 ID 只有一个事件。

这是我的桌子的样子:

<头>
ID CONTACT_ID EVENT_ID 预定
1 8,854 1,187 02/08/2 06:00
2 8,854 1,187 02/08/2 06:00
3 8,854 1,187 02/08/2 06:00
4 8,854 1,187 02/08/2 06:00
5 8,854 1,187 02/08/2 06:00
6 8,854 1,187 02/08/2 06:00
7 8,854 1,187 02/08/2 06:00
8 8,854 1,187 02/08/2 06:00
9 8,854 1,187 02/08/2 06:00
10 8,854 1,187 02/08/2 06:00
11 8,854 1,187 02/08/2 06:00
12 8,854 1,187 02/08/2 06:00
13 9,124 1,145 02/08/2 06:00
14 9,124 1,145 02/08/2 06:00
15 10,570 924 02/08/2 06:00
16 10,570 924 02/08/2 06:00

带有 event_id 1187 的 Contact_ID 8854 出现了 12 次,这意味着该联系人被安排用于同一事件 12 次,这是错误的。

Contact_ID 9124 和 event_id 1145 出现了两次。

Contact_ID 10,570 和 event_id 924 出现两次

这是我希望表格删除后的样子。

<头>
ID CONTACT_ID EVENT_ID 预定
1 8,854 1,187 02/08/2 06:00
13 9,124 1,145 02/08/2 06:00
15 10,570 924 02/08/2 06:00

删除哪个 ID 无关紧要,只要删除重复项即可。 我有大约 600 条受影响的记录,因此一次删除一条是不切实际的。

谢谢。

2 个答案:

答案 0 :(得分:1)

聚合做你想要的查询:

SELECT MIN(ID), CONTACT_ID, EVENT_ID, SCHEDULED
FROM T
GROUP BY CONTACT_ID, EVENT_ID, SCHEDULED;

如果要删除行,则可以使用相关子查询:

delete from t
    where t.id > (select min(t2.id)
                  from t t2
                  where t2.contact_id = t.contact_id and
                        t2.event_id = t.event_id and
                        t2.scheduled = t.scheduled
                 );

答案 1 :(得分:1)

看起来像 DELETE USING 的工作。

DELETE FROM t c1 USING t c2
WHERE c1.contract_id = c2.contract_id AND
      c1.id > c2.id;

演示:db<>fiddle

进一步阅读:How To Delete Duplicate Rows in PostgreSQL

相关问题