如何在KDB / Q中排成一行

时间:2014-03-24 04:51:55

标签: kdb q-lang

我有一个表rCom,它有各种各样的列。我想在每一行中总结一下..

例如:

  

日期类型A TypeB TypeC TypeD

     

date1 40.5 23.1 45.1 65.2

     

date2 23.3 32.2 56.1 30.1

如何编写q查询以添加第四列'Total',它们在每行之间求和?

4 个答案:

答案 0 :(得分:2)

为什么不呢:

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

答案 1 :(得分:2)

总和可以正常工作:

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,对于一个巨大的表来说会更好。

答案 2 :(得分:1)

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

我们将null放入a列的第一个位置。注意我们的总和现在变为空

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

有关零处理的更完整参考,请参阅the reference website

答案 3 :(得分:0)

这是有用的:

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)