ClickHouse如何对元组数组实现argMax效果 查找更优实现方案
优化方案
你当前的写法逻辑通顺,但存在多次遍历数组的性能损耗,代码也可以进一步简化。针对ClickHouse的语法特性,更简洁高效的实现如下:
场景1:仅需获取第一个元素最大的对应元组
直接调用arrayArgMax函数即可,仅需1次数组遍历就能得到结果,时间复杂度为O(n),数组越长相比原有写法的性能优势越明显:
-- 直接返回目标元组 (3,30) select arrayArgMax(a, x -> x.1) as target_tuple from ( select [(1,10),(2,20),(3,30)] a ) u
参数说明:
- 第一个参数
a:待处理的元组数组 - 第二个参数
x -> x.1:lambda表达式,指定按元组的第一个元素作为大小判断依据 - 函数返回:lambda表达式计算结果最大的数组元素,也就是第一个元素取值最大的元组
场景2:需要同时返回最大值、索引、对应第二个元素值
可以在上述方案基础上拆分结果,逻辑更紧凑:
select target_tuple.1 first_item_max_in_array, -- 不需要索引可以直接省略该字段 indexOf(a, target_tuple) index_in_array, target_tuple.2 arg_max_second_item_first_item from ( select a, arrayArgMax(a, x -> x.1) as target_tuple from (select [(1,10),(2,20),(3,30)] a) u ) t
一致性说明
当数组中存在多个元组的第一个元素同为最大值时,该方案和你原有写法的行为完全一致:都会返回第一个出现的最大值对应的元组,不会出现结果差异。如果空数组查询,两者返回的默认值规则也完全匹配。
内容的提问来源于stack exchange,提问作者unz
相关产品推荐
相关产品推荐

