ClickHouse中如何实现聚合时获取确定性的首行数据?
在ClickHouse中实现确定性聚合获取首行数据
要解决any()函数的不确定性问题,你可以通过以下几种确定性方法来获取分组后的首行数据(以下示例均基于按model升序取第一行的逻辑):
方法一:使用argMin聚合函数
argMin(col, sort_col)会返回sort_col取最小值时对应的col值,结果完全可控。若存在相同model值的记录,可拼接city/street等字段作为复合排序键,彻底消除不确定性。
示例查询:
SELECT city, street, argMin(house, model) AS house, min(model) AS model FROM address WHERE city IN ('Paris', 'Berlin', 'Minsk') GROUP BY city, street ORDER BY model;
方法二:使用窗口函数first_value
通过窗口函数在分组内按指定规则排序后直接取第一行的值,搭配DISTINCT去重(窗口函数会为每行生成结果,需去重得到分组唯一值)。
示例查询:
SELECT DISTINCT city, street, first_value(house) OVER (PARTITION BY city, street ORDER BY model ASC) AS house, first_value(model) OVER (PARTITION BY city, street ORDER BY model ASC) AS model FROM address WHERE city IN ('Paris', 'Berlin', 'Minsk') ORDER BY model;
方法三:使用groupArray结合排序与限制
将分组内的字段按指定顺序存入数组,再取数组第一个元素实现首行获取。
示例查询:
SELECT city, street, groupArray(house) ORDER BY model ASC LIMIT 1 AS house, groupArray(model) ORDER BY model ASC LIMIT 1 AS model FROM address WHERE city IN ('Paris', 'Berlin', 'Minsk') GROUP BY city, street ORDER BY model;
关键说明
- 若需要按降序取首行,只需将
ORDER BY后的ASC改为DESC即可。 - 当存在重复排序键时,务必补充额外字段(如
street/house)到排序规则中,确保排序键唯一,避免结果出现不确定性。
内容的提问来源于stack exchange,提问作者QuickDzen
相关产品推荐
相关产品推荐

