ClickHouse中合并uniq类型AggregateFunction字段的方法咨询
问题原因
users字段本身已经是uniq函数的中间状态类型AggregateFunction(uniq, String),你调用uniqState(users)相当于给状态值再次生成uniq状态,所以才会返回嵌套的AggregateFunction(uniq, AggregateFunction(uniq, String))类型,不符合预期。
正确实现方案
针对两种不同的使用需求,对应写法如下:
- 如果你需要直接得到最终的用户去重计数值(Int64类型),使用
uniqMerge函数聚合所有users字段即可:
SELECT uniqMerge(users) AS total_users FROM default.tags
- 如果你需要合并后仍然保留聚合状态,方便后续做二次聚合,使用
uniqMergeState函数,返回的类型就是标准的AggregateFunction(uniq, String):
SELECT uniqMergeState(users) AS merged_users_state FROM default.tags
如果需要同时合并表中所有聚合指标,可以用以下写法:
SELECT sum(count) AS total_count, uniqMerge(users) AS total_users, uniqMerge(sessions) AS total_sessions FROM default.tags
补充说明
ClickHouse中所有带State后缀的聚合函数生成的都是中间状态值,合并多个同类型的中间状态必须使用对应带Merge后缀的聚合函数:
- 带
Merge后缀的函数会直接返回最终聚合结果 - 带
MergeState后缀的函数会返回合并后的新中间状态,可继续用于后续聚合操作
内容的提问来源于stack exchange,提问作者Mohammadamin Aryan
相关产品推荐
相关产品推荐

