SQL需求:仅对含PHONE的行校验SRCE_NBR唯一性
SQL实现指定字段的条件去重需求
需求回顾
给定样本数据:
Name SCRE_TXT SRCE_NBR MAX PHONE 10 MAX 20 MAX ADDRESS 90 MAX PHONE 88 MAX PHONE 30 MAX 21 MAX PHONE 30 核心需求:仅对
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
相关产品推荐
相关产品推荐

