我有一个表 rCom,它有不同的列。我想总结每一行..
例如:
日期类型A 类型B 类型C 类型D
日期 1 40.5 23.1 45.1 65.2
日期2 23.3 32.2 56.1 30.1
如何编写 aq 查询以添加第四列“总计”,该列对每一行求和?
Sum 可以正常工作:
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,这对于大表来说会更好。
为什么不只是:
update Total: TypeA+TypeB+TypeC+TypeD from rCom
?
关于跨行求和的一个要点。您应该注意 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
或者,使您实际上是在简单列表而不是一般列表中求和。
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
有关 null 处理的更完整参考,请参阅参考网站
这是有效的:
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)