PostgreSQL查询引用别名列求和报trade_count列不存在解决方法
报错原因
SQL执行顺序的限制决定了,同一层级SELECT子句中定义的列别名,无法在当前SELECT的其他计算逻辑中直接引用。你代码里SUM(trade_count)引用的trade_count是同层刚定义的别名,数据库执行到该计算逻辑时还未完成别名注册,因此会抛出列不存在的错误。
除此之外,就算绕开别名引用问题,在GROUP BY exchange_name的分组聚合逻辑中直接写SUM,也只能得到单个分组内的求和结果,无法拿到全部分组的总交易数,实现不了“将总求和结果作为单独列附加到每一行”的需求。
修正后的代码
使用窗口聚合函数实现即可,无需编写嵌套子查询:
SELECT exchange_name, COUNT(exchange_name) AS trade_count, SUM(COUNT(exchange_name)) OVER () AS total_trades FROM trades WHERE trade_time / 1000 > (extract(epoch from now()) - 86400) GROUP BY exchange_name ORDER BY trade_count DESC;
逻辑说明
COUNT(exchange_name)是常规分组聚合逻辑,计算单个交易所对应的交易笔数,即你需要的trade_count字段SUM(COUNT(exchange_name)) OVER ()中的OVER()代表不对结果做分区,基于全量分组结果开窗口计算,会把所有分组的COUNT结果求和得到全平台总交易笔数,自动附加到每一行返回结果中- 这里直接嵌套调用聚合函数,不需要引用列别名,从根源上避免了别名无法识别的问题
内容的提问来源于stack exchange,提问作者Husnain Mehmood
相关产品推荐
相关产品推荐

