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

SQL需求:仅对含PHONE的行校验SRCE_NBR唯一性

SQL实现指定字段的条件去重需求

需求回顾

给定样本数据:

NameSCRE_TXTSRCE_NBR
MAXPHONE10
MAXEMAIL20
MAXADDRESS90
MAXPHONE88
MAXPHONE30
MAXEMAIL21
MAXPHONE30

核心需求:仅对SCRE_TXT = 'PHONE'的行,校验并保留唯一的SRCE_NBR;其余类型的行无需去重,全部保留。最终期望输出如题目所示。


方法一:使用窗口函数(推荐,灵活可控)

这种方法通过窗口函数给目标分组添加行号,实现精准的条件去重,适合需要自定义排序或更复杂逻辑的场景:

WITH ranked_records AS (
    SELECT 
        Name,
        SCRE_TXT,
        SRCE_NBR,
        -- 对PHONE行按Name、SCRE_TXT、SRCE_NBR分组,生成行号
        ROW_NUMBER() OVER (
            PARTITION BY Name, SCRE_TXT, SRCE_NBR 
            ORDER BY (SELECT NULL) -- 无需特定排序时用此,若需保留最早/最晚行可替换为时间字段
        ) AS row_num
    FROM your_table -- 替换成你的实际表名
)
SELECT Name, SCRE_TXT, SRCE_NBR
FROM ranked_records
WHERE 
    -- 非PHONE行全部保留
    SCRE_TXT != 'PHONE' 
    -- PHONE行只保留每组的第一行(即去重后的数据)
    OR row_num = 1
-- 排序以匹配示例输出的顺序,可根据实际需求调整
ORDER BY 
    CASE WHEN SCRE_TXT = 'PHONE' THEN 1 ELSE 2 END,
    SRCE_NBR;

方法二:使用UNION ALL拆分处理(直观易懂)

把数据拆成两部分分别处理:非PHONE的全量行,以及PHONE的去重行,再合并结果:

-- 第一部分:保留所有非PHONE的行
SELECT Name, SCRE_TXT, SRCE_NBR
FROM your_table
WHERE SCRE_TXT != 'PHONE'

UNION ALL

-- 第二部分:对PHONE行去重
SELECT DISTINCT Name, SCRE_TXT, SRCE_NBR
FROM your_table
WHERE SCRE_TXT = 'PHONE'

-- 排序对齐示例输出
ORDER BY 
    CASE WHEN SCRE_TXT = 'PHONE' THEN 1 ELSE 2 END,
    SRCE_NBR;

内容的提问来源于stack exchange,提问作者Higher Quality

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:40