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

Oracle SQL去重:指定Source列优先选'01'的实现方案求助

Oracle SQL 数据去重及优先级选取问题处理

问题场景

  • 数据表包含Company、Report date、source三列
  • 存在同一Company与Report date组合对应多个source的重复数据
  • 处理需求:优先保留source为'01'的记录;若该组合下无'01'来源,则保留source为'02'的记录

原SQL的问题分析

你提供的SQL逻辑完全不符合需求,且存在语法错误:

  1. 逻辑偏差:子查询中用窗口函数统计的是Company+Report date+source组合的行数,外层WHERE b>1仅筛选该组合重复的记录,完全没涉及source的优先级选取逻辑
  2. 语法错误:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 06:28:26