ClickHouse 列 xxx 不在聚合函数下且不在 GROUP BY 键中

问题描述 投票:0回答:1

我有一个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 相同的结果,那么问题是什么?

aggregate clickhouse
1个回答
0
投票

您当前查询的问题:

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;
© www.soinside.com 2019 - 2024. All rights reserved.