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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 04:52:48