ClickHouse不同版本聚合列别名解析行为差异咨询
ClickHouse聚合列别名处理的版本差异解析
问题概述
现有ClickHouse 24.1.1.2048实例,迁移至24.3.2.23(及24.6.1.4423)版本时,发现聚合列别名的查询行为存在明显差异,需明确该差异是操作错误还是特性变更导致。
测试环境与数据
测试表结构及初始化数据如下:
create table t (code varchar(10), val int) engine=Memory; insert into t values ('a', 10); insert into t values ('a', 20); insert into t values ('a', 30); insert into t values ('b', 11);
不同版本的行为表现
24.1.1.2048版本
- 查询1(使用聚合结果别名计算avg)
执行以下语句可正常得到预期结果:
SELECT code, SUM(val) AS val, val / COUNT(1) AS avg FROM t GROUP BY code;
查询结果:
| code | val | avg |
|---|---|---|
| b | 11 | 11 |
| a | 60 | 20 |
- 查询2(聚合函数直接参与运算)
执行以下语句触发合理报错:
SELECT code, SUM(val) AS val, SUM(val) / COUNT(1) AS avg FROM t GROUP BY code;
报错信息:
Code: 184. DB::Exception: Aggregate function sum(val) is found inside another aggregate function in query: While processing sum(val) AS val. (ILLEGAL_AGGREGATION) (version 24.1.1.2048 (official build))
24.3.2.23及24.6.1.4423版本
- 查询1(使用聚合结果别名计算avg)
执行原语句触发报错:
SELECT code, SUM(val) AS val, val / COUNT(1) AS avg FROM t GROUP BY code;
报错信息:
Code: 215. DB::Exception: Column dt.t.val is not under aggregate function and not in GROUP BY keys. In query SELECT code, sum(val) AS val, val / count(1) AS avg FROM t GROUP BY code. (NOT_AN_AGGREGATE) (version 24.3.2.23 (official build))
- 查询2(聚合函数直接参与运算)
执行该语句可正常得到预期结果:
SELECT code, SUM(val) AS val, SUM(val) / COUNT(1) AS avg FROM t GROUP BY code;
查询结果:
| code | val | avg |
|---|---|---|
| b | 11 | 11 |
| a | 60 | 20 |
差异原因说明
该差异是ClickHouse的特性变更,而非操作错误:
- SQL标准合规性调整:24.1版本中支持在同层级SELECT子句中引用聚合结果的别名,属于ClickHouse的非标准扩展;24.3及后续版本为了严格遵循SQL标准(SQL标准规定SELECT子句中定义的别名不能被同层级的其他表达式引用),移除了该扩展支持,因此查询1中
val / COUNT(1)会被解析为原始表的val列,而非聚合后的别名val,触发NOT_AN_AGGREGATE报错。 - 聚合逻辑判断修复:24.1版本错误地将
SUM(val)/COUNT(1)判定为聚合函数嵌套(属于非法聚合),而实际上这是聚合结果之间的算术运算,不属于嵌套聚合。24.3及后续版本修正了该判断逻辑,允许此类运算正常执行,因此查询2可正常返回结果。
内容的提问来源于stack exchange,提问作者Joker Bean.
相关产品推荐
相关产品推荐

