如何在KDB中按分组列聚合所有列(无需逐列指定)
KDB+按组批量聚合非分组列的方法
首先给出示例表的定义:
j:([] x: til 10; y: til 10; g: 10#`a`b`c)
表结构如下:
x y g ----- 0 0 a 1 1 b 2 2 c 3 3 a 4 4 b 5 5 c 6 6 a 7 7 b 8 8 c 9 9 a
问题需求
如何按g分组时,无需逐个显式指定列名(比如sum x, sum y),就能对所有非分组列统一应用聚合操作?像select sum by g from j这种简洁写法无法运行,而逐个列指定的方式又不够高效。
解决方案
可以利用KDB+的cols函数获取表的所有列名,排除分组列后,结合each操作符批量对列应用聚合函数,示例写法如下:
select sum each (cols[j] except `g) by g from j
运行后会得到按g分组,对x和y列分别求和的结果:
g | x y -------- a | 18 18 b | 12 12 c | 15 15
如果需要更换聚合函数(比如求平均值),只需替换sum即可:
select avg each (cols[j] except `g) by g from j
这种写法的优势在于,即使后续表中新增了其他非分组列,也无需修改聚合语句,会自动对所有非分组列应用指定的聚合操作。
内容的提问来源于stack exchange,提问作者cjm2671
相关产品推荐
相关产品推荐

