我有一个数据库(表名是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 条受影响的记录,因此一次删除一条是不切实际的。
谢谢。
答案 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