ClickHouse中按Array(Tuple)元素分组聚合数值的实现问询
ClickHouse数组元组分组聚合解决方案
要实现按records.a分组对records.b求和的需求,核心是先将数组中的元组拆分为独立行,再进行分组聚合,具体实现如下:
方法一:生成键值对Map格式(匹配期望输出)
SELECT mapFromArrays(groupArray(a), groupArray(total_b)) AS result FROM ( SELECT record.a AS a, sum(record.b) AS total_b FROM meetings ARRAY JOIN records AS record GROUP BY a )
执行逻辑:
- 展开数组元组:使用
ARRAY JOIN records AS record将每个数组中的元组拆分为单独的数据行,此时每条行对应一个(a, b, c)元组的具体值。 - 分组求和:按
a字段分组,对每组的b值求和,得到每个a对应的总数值。 - 转换为Map格式:通过
mapFromArrays将分组后的a列表与对应的求和结果列表组合,生成符合期望的键值对结构。
方法二:生成常规分组结果(更直观的列表形式)
如果不需要Map格式,直接获取分组求和的明细结果,可使用以下简化语句:
SELECT record.a AS meeting_type, sum(record.b) AS total_b FROM meetings ARRAY JOIN records AS record GROUP BY meeting_type
该语句会输出:
meeting_type | total_b interview | 14 sync | 2
验证数据匹配:
针对你插入的测试数据:
[{a: 'interview', b: 3, c: 'x'}, {a: 'sync', b: 2, c: 'y'}],[{a:'interview', b: 11, c: 'l'}]
展开后会得到3条独立行:(interview,3), (sync,2), (interview,11),分组求和后恰好得到interview:14、sync:2的结果。
内容的提问来源于stack exchange,提问作者kobe24
相关产品推荐
相关产品推荐

