Clickhouse中如何对多行数组向量求均值合并
ClickHouse 多数组按位置求均值实现方案
你要实现的是按ID分组,对每个ID下的所有vector数组按对应位置计算均值,你原来的SQL思路其实是正确的,这里提供两种更简洁灵活的实现方式:
方法一:arrayZip + arrayMap(推荐)
这种写法更直观,利用arrayZip把同位置的元素聚合为子数组,再逐个计算均值:
SELECT id, arrayMap(sub_array -> avg(sub_array), arrayZip(groupArray(vector))) AS avg_vector FROM embeddings GROUP BY id
执行逻辑:
groupArray(vector)将同一ID下的所有vector合并成二维数组,比如ID=123会得到[[-0.1,0.3,0.2], [0.3,0.2,-0.1]]arrayZip(...)把二维数组按位置打包,生成[[-0.1,0.3], [0.3,0.2], [0.2,-0.1]]arrayMap(...)对每个打包后的子数组计算均值,最终得到目标平均向量
方法二:优化你的原有写法(动态适配数组长度)
你原来的代码可以改成动态获取数组长度,不用硬编码range(3),适配不同长度的vector:
SELECT id, arrayMap( i -> arrayReduce('avg', arrayMap(x -> x[i], groupArray(vector))), range(length(vector)) ) AS avg_vector FROM embeddings GROUP BY id
执行逻辑:
length(vector)自动获取数组长度,避免写死数字- 内层
arrayMap(x -> x[i], ...)提取所有vector的第i个元素组成数组 arrayReduce('avg', ...)计算该数组的均值,按位置生成最终的平均向量
这两种方法都能输出你需要的结果,方法一的可读性更强。
内容的提问来源于stack exchange,提问作者Dojo Nik
相关产品推荐
相关产品推荐

