如何实现对两列单独去重而非联合去重的SQL查询
SQL查询需求:实现
Campaign_mapping与Leads关联后双列全局唯一 核心需求
- 关联
Campaign_mapping(带过滤逻辑的复杂查询结果)与Leads表 - 查询结果必须满足两个独立的全局唯一约束:
Campaign_mapping.emailid_id全程无重复Leads.id全程无重复
- 注意:不是对两列做联合去重,而是每一列各自保持全局唯一
现有问题
此前尝试的查询存在两类明显缺陷:
- 要么出现同一
Leads.id被多次匹配的情况 - 要么过度过滤,丢失大量有效数据
解决方案(优先JOIN实现)
方案1:窗口函数+JOIN实现双向唯一
先对两张表分别做预处理,确保目标列唯一,再执行关联:
-- 预处理Campaign_mapping,确保emailid_id唯一,可按业务规则排序取优先级最高的记录 WITH unique_campaign AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY emailid_id ORDER BY create_time DESC) AS rn FROM Campaign_mapping -- 保留原有过滤条件 WHERE [你的过滤条件] ), -- 预处理Leads表(如果Leads.id本身是主键,可跳过此CTE) unique_leads AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY create_time DESC) AS rn FROM Leads ) SELECT uc.emailid_id, ul.id, -- 按需选择其他字段 uc.campaign_name, ul.lead_name FROM unique_campaign uc JOIN unique_leads ul ON uc.lead_match_column = ul.lead_match_column WHERE uc.rn = 1 AND ul.rn = 1;
方案2:WHERE IN 简化实现(适合简单关联场景)
如果关联逻辑简单,可先提取唯一的目标列集合,再关联:
SELECT cm.emailid_id, l.id, -- 按需选择其他字段 cm.campaign_name, l.lead_name FROM ( SELECT DISTINCT emailid_id, lead_match_column FROM Campaign_mapping WHERE [你的过滤条件] ) cm JOIN ( SELECT DISTINCT id, lead_match_column FROM Leads ) l ON cm.lead_match_column = l.lead_match_column;
方案3:应用层轻量处理
如果SQL层面实现复杂,可先获取所有关联记录,在应用层做简单去重:
- 维护两个哈希集合:
seen_email_ids和seen_lead_ids - 遍历查询结果,仅保留既不在
seen_email_ids也不在seen_lead_ids中的记录,同时将对应ID加入集合
说明
- 示例中的
create_time、lead_match_column、[你的过滤条件]等占位符,需替换为实际业务字段和逻辑 - 窗口函数方案的
ORDER BY可根据业务调整,比如优先保留最新记录、特定状态记录等
内容的提问来源于stack exchange,提问作者Abhishek Anand
相关产品推荐
相关产品推荐

