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
相关产品推荐
相关产品推荐

