Oracle SQL去重:指定Source列优先选'01'的实现方案求助
Oracle SQL 数据去重及优先级选取问题处理
问题场景
- 数据表包含
Company、Report date、source三列 - 存在同一
Company与Report date组合对应多个source的重复数据 - 处理需求:优先保留
source为'01'的记录;若该组合下无'01'来源,则保留source为'02'的记录
原SQL的问题分析
你提供的SQL逻辑完全不符合需求,且存在语法错误:
- 逻辑偏差:子查询中用窗口函数统计的是
Company+Report date+source组合的行数,外层WHERE b>1仅筛选该组合重复的记录,完全没涉及source的优先级选取逻辑 - 语法错误:
Report date是带空格的列名,Oracle中需用双引号"Report date"包裹才能识别- 窗口函数的别名
b不能直接在同层WHERE中使用,需放到外层查询判断 - 子查询未闭合,缺少右括号
正确实现方案
方案1:ROW_NUMBER()窗口函数(推荐)
这种方式逻辑清晰,性能稳定,适合处理优先级排序类的去重需求:
SELECT company, "Report date", source FROM ( SELECT company, "Report date", source, -- 按公司+报告日期分组,给source设置优先级排序 ROW_NUMBER() OVER ( PARTITION BY company, "Report date" ORDER BY CASE source WHEN '01' THEN 1 -- 优先级最高 WHEN '02' THEN 2 -- 次优先级 ELSE 3 -- 其他来源优先级最低 END ) AS rn FROM your_table_name -- 替换为你的实际表名 ) t WHERE rn = 1; -- 取每组中优先级最高的第一条记录
方案2:NOT EXISTS子查询
适合简单场景,逻辑直观:
SELECT company, "Report date", source FROM your_table_name t1 WHERE source = '01' -- 仅当同一公司+报告日期下没有'01'来源时,才选取'02'的记录 OR ( source = '02' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.company = t1.company AND t2."Report date" = t1."Report date" AND t2.source = '01' ) );
内容的提问来源于stack exchange,提问作者JKwo
相关产品推荐
相关产品推荐

