You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现对两列单独去重而非联合去重的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 03:27:24