You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 17:15:20