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

Oracle SQL:无需GROUP BY提取同年度重复NUMB值的方法求助

解决Oracle中提取年度内重复NUMB数据的问题

你需要的是同一年度内NUMB重复的所有完整记录,之前用GROUP BY的方式之所以结果骤减,是因为添加BLNC_TIP后分组粒度变细——只有当NUMB、年度、BLNC_TIP三者完全一致的行才会被归为一组,而你要的是仅基于NUMB和年度的重复,和BLNC_TIP无关。

下面两种方法可以直接拿到你需要的所有重复记录:

方法1:窗口函数(推荐)

通过窗口函数统计每个NUMB在对应年度内的出现次数,再筛选次数大于1的行,保留所有字段信息:

SELECT *
FROM (
    SELECT 
        t.*,
        -- 按NUMB和年份分组统计出现次数
        COUNT(*) OVER (PARTITION BY NUMB, EXTRACT(YEAR FROM YOUR_DATE_COLUMN)) AS dup_count
    FROM YOUR_TABLE_NAME t
)
WHERE dup_count > 1
ORDER BY NUMB, YOUR_DATE_COLUMN;

替换YOUR_DATE_COLUMN为存储年份的日期列,YOUR_TABLE_NAME为你的表名即可。

方法2:EXISTS子查询

通过子查询判断当前行的NUMB在同一年度是否存在其他记录,返回所有符合条件的行:

SELECT t1.*
FROM YOUR_TABLE_NAME t1
WHERE EXISTS (
    SELECT 1
    FROM YOUR_TABLE_NAME t2
    WHERE t2.NUMB = t1.NUMB
      AND EXTRACT(YEAR FROM t2.YOUR_DATE_COLUMN) = EXTRACT(YEAR FROM t1.YOUR_DATE_COLUMN)
      AND t2.ROWID != t1.ROWID -- 排除当前行自身
)
ORDER BY t1.NUMB, t1.YOUR_DATE_COLUMN;

补充说明

  • 初始GROUP BY返回42条,是因为统计的是NUMB+年度的重复组合数;添加BLNC_TIP后,只有三者都重复的组合才会被统计,所以结果只剩6条,这和你要的“提取所有重复记录”的需求不匹配。
  • 去掉GROUP BY返回全部数据是因为没有筛选条件,自然会返回所有行。

内容的提问来源于stack exchange,提问作者Al.Vioky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:32:46