SQL窗口函数使用报错:列需出现在聚合函数或GROUP BY子句中
报错原因
核心是SQL执行顺序和GROUP BY的作用范围冲突:
- SQL执行优先级为:
WHERE过滤→GROUP BY分组→SELECT子句计算(含窗口函数) - 执行完GROUP BY按天分组后,中间结果集仅保留两类内容:GROUP BY指定的日期间隔值、基于原始字段聚合后的计算结果,原始的
transaction_amount字段已经不存在于该中间结果集中 - 你在窗口函数中直接使用
SUM(transaction_amount),此时数据库找不到GROUP BY后的transaction_amount字段,默认指向原始表的未聚合字段,因此触发「字段必须出现在GROUP BY或聚合函数中」的报错。
修正方案
先按天聚合得到每日总交易额,再基于聚合后的结果计算3日移动平均值即可,参考代码如下:
SELECT Jan20_day, daily_amount, -- 窗口函数基于已聚合的日交易额计算平均值 AVG(daily_amount) OVER(ORDER BY Jan20_day ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_average FROM ( -- 内层先完成日维度的交易额汇总 SELECT EXTRACT(DAY FROM transaction_time) AS Jan20_day, SUM(transaction_amount) AS daily_amount FROM sales WHERE EXTRACT(MONTH FROM transaction_time) = 1 AND EXTRACT(YEAR FROM transaction_time) = 2020 GROUP BY EXTRACT(DAY FROM transaction_time) ) daily_sales ORDER BY Jan20_day
内容的提问来源于stack exchange,提问作者Reid Haynie
相关产品推荐
相关产品推荐

