ClickHouse建表报Aggregate function minState位置错误该如何解决?
错误原因
minState属于聚合类函数,仅允许在带有GROUP BY的聚合查询上下文中调用,直接在列定义的MATERIALIZED表达式中对单行字段调用该函数属于非法使用场景,触发了类型不兼容校验。- 你定义的
users列类型为AggregateFunction(min, UInt64),用于存储min聚合的中间状态,直接对单行值调用minState生成的结果不符合该列的类型要求。
解决方案
根据使用场景可以选择以下任意一种方案:
方案一(优先推荐):使用SimpleAggregateFunction简化逻辑
如果需求只是在AggregatingMergeTree合并数据时自动取相同排序键下origin_user的最小值,不需要保留复杂聚合中间状态,可以用SimpleAggregateFunction替换原类型,无需调用State系列函数,修改后的建表语句如下:
CREATE TABLE user_dwd.user_tag_bitmap_local ( `tag` String, `tag_item` String, `p_day` Date, `origin_user` UInt64, `users` SimpleAggregateFunction(min, UInt64) MATERIALIZED origin_user ) ENGINE = AggregatingMergeTree() PARTITION BY toYYYYMMDD(p_day) ORDER BY (tag, tag_item) SETTINGS index_granularity = 8192;
查询时直接读取users列即可得到合并后的最小值,无需调用Merge系列函数。
方案二:保留AggregateFunction类型,显式转换类型
如果业务要求必须使用AggregateFunction存储聚合中间状态,需要对MATERIALIZED表达式增加显式类型转换,修改后的列定义如下:
`users` AggregateFunction(min, UInt64) MATERIALIZED CAST(minState(origin_user) AS AggregateFunction(min, UInt64))
查询时需要调用minMerge(users)才能得到最终的最小值结果。
内容的提问来源于stack exchange,提问作者user2542188
相关产品推荐
相关产品推荐

