SQL窗口函数AVG PARTITION BY多列分组统计不生效问题咨询
问题原因
你代码的核心错误是在WINDOW子句的PARTITION BY、ORDER BY后用单引号包裹了字段名:
- SQL中单引号用于标识字符串常量,你写的
PARTITION BY 'age', 'working', 'sex'等价于按三个固定不变的字符串做分区,所有数据会被归入同一个分区,最终计算的是全表所有数据的平均值,不会按三个维度拆分分组。 - 额外冗余问题:如果你需要的是整个分组的平均值,不需要在窗口定义中加
ORDER BY,加了之后窗口函数会默认计算「从分区第一行到当前行」的滑动平均值,和你的需求不符。
修正方案
方案1:保留所有原始行,每行附带所属分组的平均值(使用窗口函数)
SELECT working, sex, age, ROUND(AVG(primaryNeeds) OVER(w),1) AS primaryNeeds_avg, ROUND(AVG(work) OVER(w),1) AS work_avg, ROUND(AVG(other) OVER(w),1) AS other_avg FROM demography WINDOW w AS (PARTITION BY age, working, sex)
方案2:仅输出每个分组的聚合结果(使用普通GROUP BY,性能更优)
如果不需要保留原始明细行,直接按分组输出统计值,用普通聚合查询更合适:
SELECT working, sex, age, ROUND(AVG(primaryNeeds),1) AS primaryNeeds_avg, ROUND(AVG(work),1) AS work_avg, ROUND(AVG(other),1) AS other_avg FROM demography GROUP BY age, working, sex
内容的提问来源于stack exchange,提问作者Jelly
相关产品推荐
相关产品推荐

