如何在KDB/Q中跨行求和

如何在KDB/Q中跨行求和,kdb,q-lang,Kdb,Q Lang,我有一个rCom表,它有不同的列。我想把每一行的数字加起来 例如: 日期类型A类型B类型C类型 日期140.5 23.1 45.1 65.2 日期2 23.3 32.2 56.1 30.1 如何编写一个q查询来添加第四列“总计”以在每行中求和?这就是有效的方法: select Answer:{[x;y;z;a] x+y+z+a }'[TypeA;TypeB;TypeC;TypeD] from ([] dt:2014.01.01 2014.01.02 2014.01.03; TypeA:4 5

我有一个rCom表,它有不同的列。我想把每一行的数字加起来

例如:

日期类型A类型B类型C类型

日期140.5 23.1 45.1 65.2

日期2 23.3 32.2 56.1 30.1

如何编写一个q查询来添加第四列“总计”以在每行中求和?

这就是有效的方法:

select Answer:{[x;y;z;a] x+y+z+a }'[TypeA;TypeB;TypeC;TypeD] from 
([] dt:2014.01.01 2014.01.02 2014.01.03; TypeA:4 5 6; TypeB:1 2 3; TypeC:8 9 10; TypeD:3 4 5) 
为什么不只是:

update Total: TypeA+TypeB+TypeC+TypeD from rCom

求和就行了:

q)flip`a`b`c!3 3#til 9
a b c
-----
0 3 6
1 4 7
2 5 8
q)update d:sum(a;b;c) from flip`a`b`c!3 3#til 9
a b c d
--------
0 3 6 9
1 4 7 12
2 5 8 15

Sum有map reduce,这对于一个巨大的表来说会更好。

关于行间求和的一个快速要点。您应该注意1列中的null会导致求和结果为null。借用@WooiKent Lee的例子

我们在列的第一个位置放一个null。注意我们的总和现在是如何变为空的

q)wn:.[flip`a`b`c!3 3#til 9;(0;`a);first 0#] //with null
q)update d:sum (a;b;c) from wn
a b c d
--------
  3 6
1 4 7 12
2 5 8 15
这是处理
q
中空值的方式的直接影响。如果在简单列表中求和,则忽略空值

q)sum 1 2 3 0N
6
但是,常规列表中的总和不会显示此行为

q)sum (),/:1 2 3 0N
,0N
因此,对于您的表格情况,您可能希望事先填写一个零

q)update d:sum 0^(a;b;c) from wn
a b c d
--------
  3 6 9
1 4 7 12
2 5 8 15
或者,将其设为s.t.您实际上是在简单列表中求和,而不是在一般列表中求和

q)update d:sum each flip (a;b;c) from wn
a b c d
--------
  3 6 9
1 4 7 12
2 5 8 15

有关空值处理的更完整参考,请参见

(如果rCom不可更新,则替换为相应的select语句)。如果您只添加列,选择colA+colB等,则它将在