我有一个包含超过20万条记录的广告系列成员的表格。 我们遇到的问题是,不同的联系人共享相同的电子邮件地址但订阅了不同的广告系列。我需要识别的是任何与其他联系人有重复电子邮件但未订阅同一组广告系列的联系人。有100个不同的广告系列,联系人可能会订阅所有广告系列。该表包含许多字段,但我需要的相关内容是可以由多个联系人共享的电子邮件,Contact_ID是唯一且区分大小写的,Campaign_ID是唯一且区分大小写但可以分配给多个联系人。
+----------------------+------------+------------+-----------+-------------+---------------+
| Email | Contact_ID | First_Name | Last_Name | Campaign_ID | Campaign_Name |
+----------------------+------------+------------+-----------+-------------+---------------+
| John@mail.com | 300ABC | John | Smith | 100xyz | Campaign 1 |
| Mary@mail.com | 300abc | Mary | Smith | 100wyz | Campaign 2 |
| JonesFamily@mail.com | 300Abc | Jim | Jones | 100xyz | Campaign 1 |
| JonesFamily@mail.com | 300Abc | Jim | Jones | 100Wyz | Campaign 3 |
| JonesFamily@mail.com | 300abC | Jane | Jones | 100xyz | Campaign 1 |
| JonesFamily@mail.com | 300abC | Jane | Jones | 100Wyz | Campaign 3 |
| JonesFamily@mail.com | 300abC | Jane | Jones | 100Ayz | Campaign 4 |
+----------------------+------------+------------+-----------+-------------+---------------+
根据示例,Jim和Jane Jones共享一个电子邮件地址并订阅5个广告系列2是相同的,但Jane也订阅了Campaign 4.我需要编写标识Jim和Jane的脚本,因为他们共享电子邮件但不订阅同一组广告系列。最终目标是我们从一个联系人中删除电子邮件地址,但确保他们订阅了所有广告系列。
答案 0 :(得分:0)
我认为您可以使用group_concat()
执行此操作:
select email, group_concat(firstname, ' ', lastname) as commonnames
from (select email, firstname, lastname,
group_concat(distinct campaign_id order by campaign_id) as campaigns
from table t
group by email, firstname, lastname
) en
group by email
having count(*) > 1 and min(campaigns) <> max(campaigns);
子查询获取给定联系人的广告系列列表(基于名称;您可能还有其他条件)。然后,外部查询会选择具有多个广告系列不匹配的人的电子邮件。