PostgreSQL如何先取最近5年数据再对指定列求和
错误原因
你当前的SQL写法存在两个逻辑问题:
- 使用
SUM聚合函数后,查询默认会把所有符合WHERE条件的行合并为1行结果,此时直接用ORDER BY year会触发分组聚合规则报错:非聚合、非分组的字段不能直接在聚合查询的ORDER BY/SELECT中引用。 - 外层聚合后只剩1行结果,
LIMIT 5完全不会生效,不可能实现取最近5年数据再求和的需求。
解决方案
先通过子查询筛选出最近5年的目标数据,再在外层做求和运算即可:
SELECT SUM(carbon) AS totalCarbon FROM ( -- 内层先取最近5年的原始数据 SELECT cb.carbon FROM company.carbon cb WHERE UPPER(ticker) = 'IBM.US' ORDER BY year DESC LIMIT 5 ) AS recent_5_year_records
注意事项
如果同一个ticker、同一年存在多条数据,需要先在内层按年份做分组聚合,避免重复统计:
SELECT SUM(annual_carbon) AS totalCarbon FROM ( -- 内层先按年聚合得到每年的总和,再取最近5年 SELECT SUM(cb.carbon) AS annual_carbon FROM company.carbon cb WHERE UPPER(ticker) = 'IBM.US' GROUP BY year ORDER BY year DESC LIMIT 5 ) AS recent_5_year_annual_data
内容的提问来源于stack exchange,提问作者Lostsoul
相关产品推荐
相关产品推荐

