如何在SQL中按年月分组计算评分平均值
问题根因
原代码无法得到正确结果,是两个写法错误导致的:
- 混用窗口函数与分组聚合:
AVG() OVER(...)是窗口函数,会保留所有原始行、为每一行附加窗口计算结果,不会折叠分组后的行,不符合按月聚合的需求 - GROUP BY粒度错误:把
score加入分组字段后,分组维度变成了「月份+具体评分值」,无法计算整月的全局平均分
正确实现代码
不需要用窗口函数,直接用普通分组聚合即可,额外加月份截断处理避免跨年同月混淆、保证排序正确:
SELECT TO_CHAR(created_at, 'Mon YYYY') AS date, AVG(score) AS average_score FROM reviews WHERE score IS NOT NULL GROUP BY TO_CHAR(created_at, 'Mon YYYY'), DATE_TRUNC('month', created_at) ORDER BY DATE_TRUNC('month', created_at);
代码说明:
DATE_TRUNC('month', created_at)会把日期统一截断到对应月份的第一天,既可以保证不同年份的相同月份不会被错误归为一组,也能让最终结果按时间先后顺序输出,和预期格式完全匹配。
基于给出的示例数据,上述代码执行后返回的结果和需求完全一致:
| date | average_score |
|---|---|
| Jan 2022 | 3 |
| Feb 2022 | 2.5 |
| Mar 2022 | 5 |
内容的提问来源于stack exchange,提问作者ArchieJG
相关产品推荐
相关产品推荐

