Oracle新手使用OVER(PARTITION BY)时遇ORA-00979错误求助
修复ORA-00979: not a GROUP BY expression错误
问题原因
你的SQL存在以下逻辑和语法错误:
- 错误混用窗口函数与
HAVING子句:HAVING是配合GROUP BY实现聚合后筛选的,而窗口函数不需要依赖GROUP BY,二者不能这样搭配使用。 - 行级过滤条件
IS_STANDARD = 0应放在WHERE子句中,而非HAVING(HAVING仅用于聚合结果的过滤)。 MAX(NAME)未指定计算范围:既没有通过GROUP BY指定分组,也没有通过窗口函数限定范围,Oracle无法确定如何计算这个最大值。
修复方案
根据你要实现的「筛选出IS_STANDARD=0且每个EFF_DATE下记录数为43的数据,同时获取对应EFF_DATE的最大NAME」需求,提供两种可行写法:
写法1:窗口函数+子查询(保留所有符合条件的行)
这种写法会返回每个符合条件的EFF_DATE下的所有原始行,并附带该日期的统计数和最大NAME:
SELECT eff_date, cnt_per_date, max_name FROM ( SELECT eff_date, COUNT(1) OVER(PARTITION BY EFF_DATE) AS cnt_per_date, MAX(NAME) OVER(PARTITION BY EFF_DATE) AS max_name, IS_STANDARD FROM TBL_LCR_REP_PROFILE_DETAIL WHERE IS_STANDARD = 0 ) t WHERE cnt_per_date = 43;
写法2:GROUP BY聚合(仅返回日期级统计结果)
如果只需要每个符合条件的EFF_DATE的一行聚合信息,可使用这种方式:
SELECT eff_date, COUNT(1) AS cnt_per_date, MAX(NAME) AS max_name FROM TBL_LCR_REP_PROFILE_DETAIL WHERE IS_STANDARD = 0 GROUP BY eff_date HAVING COUNT(1) = 43;
内容的提问来源于stack exchange,提问作者secretgirl2023
相关产品推荐
相关产品推荐

