我有一个ClickHouse实例24.1.1.2408,最近又创建了一个实例24.3.2.23用于传输,发现了聚合的差异行为处理列别名,我想知道我是否犯了任何错误或者是否有任何功能改变?
这是示例表:
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 中,可以识别列名称和聚合结果别名,并且输出与预期匹配:
SELECT code, sum(val) as val, val / count(1) as avg from t group by code;
代码 | 瓦尔 | 平均 |
---|---|---|
b | 11 | 11 |
a | 60 | 20 |
另一种风格可能会导致聚合重新计算,所以它给了我一个错误,这似乎很有意义。
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 中,情况发生了变化,似乎聚合函数结果的别名无法识别,它给了我这样的错误:
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))
使用第二种风格效果很好:
SELECT code, sum(val) as val, sum(val) / count(1) as avg from t group by code;
代码 | 瓦尔 | 平均 |
---|---|---|
b | 11 | 11 |
a | 60 | 20 |
在 24.6.1.4423 中测试得到与版本 24.3.2.23 相同的结果,那么问题是什么?
您当前查询的问题:
SELECT code, sum(val) as val, val / count(1) as avg from t group by code;
是表达式
val
中select子句中的val / count(1)
指的是列val
,而不是同级定义的别名。 通常,在 SQL 中不可能引用同一 SELECT
子句中定义的别名。 这里最简单的解决方法是重复 SUM(val)
表达式:
SELECT code, SUM(val) AS val, SUM(val) / COUNT(1) AS avg FROM t GROUP BY code;