通过符号在每个时间点累积所有值

时间:2018-10-19 15:59:27

标签: kdb

我有这张桌子:

execs:([]time:til 12;sym:`a`b`c`a`c`c`c`b`b`a`b`c;leavesQty:(1000;900;1300;800;1200;900;600;800;400;300;200;100))

我有不同的符号,有时每个符号都有leavesQty。现在,我想以这种方式扩展表,使得每行我此时都可以通过sym获取所有leavesQty项的总和。

因此,在此示例中,我必须得出以下值:

execs:([]time:til 12;sym:`a`b`c`a`c`c`c`b`b`a`b`c;leavesQty:(1000;900;1300;800;1200;900;600;800;400;300;200;100);accLeavesQty:(1000;1900;3200;3000;2900;2600;2300;2200;1800;1300;1100;600))

4 个答案:

答案 0 :(得分:5)

如果使用fby,则使用单个更新语句添加此列:

q)update accLeavesQty:sums (deltas;leavesQty) fby sym from execs
time sym leavesQty accLeavesQty
-------------------------------
0    a   1000      1000
1    b   900       1900
2    c   1300      3200
3    a   800       3000
4    c   1200      2900
5    c   900       2600
6    c   600       2300
7    b   800       2200
8    b   400       1800
9    a   300       1300
10   b   200       1100
11   c   100       600

答案 1 :(得分:3)

首先,您要获取每个符号的叶子数量的变化量,以便可以看到值随时间的变化。之后,您只需要对结果列进行累加即可。

 q)update sums accLeavesQty from update accLeavesQty:deltas leavesQty by sym  from execs
time sym leavesQty accLeavesQty
-------------------------------
0    a   1000      1000        
1    b   900       1900        
2    c   1300      3200        
3    a   800       3000        
4    c   1200      2900        
5    c   900       2600        
6    c   600       2300        
7    b   800       2200        
8    b   400       1800        
9    a   300       1300        
10   b   200       1100        
11   c   100       600  

答案 2 :(得分:3)

您对fby有很好的看法

q)update accLeavesQty:sums (deltas;leavesQty) fby sym from execs
time sym leavesQty accLeavesQty
-------------------------------
0    a   1000      1000
1    b   900       1900
2    c   1300      3200
3    a   800       3000
4    c   1200      2900
5    c   900       2600
6    c   600       2300
7    b   800       2200
8    b   400       1800
9    a   300       1300
10   b   200       1100
11   c   100       600

答案 3 :(得分:1)

另一种涉及递归的方法:

update accLeavesQty:sum each @[;;:;]\[()!();sym;leavesQty] from execs

它为每个符号保留最后一个accLeavesQty的运行词典,然后计算每个符号的总和

q)update accLeavesQty:@[;;:;]\[()!();sym;leavesQty] from execs
time sym leavesQty accLeavesQty
---------------------------------------
0    a   1000      (,`a)!,1000
1    b   900       `a`b!1000 900
2    c   1300      `a`b`c!1000 900 1300
3    a   800       `a`b`c!800 900 1300
4    c   1200      `a`b`c!800 900 1200
5    c   900       `a`b`c!800 900 900
6    c   600       `a`b`c!800 900 600
7    b   800       `a`b`c!800 800 600
8    b   400       `a`b`c!800 400 600
9    a   300       `a`b`c!300 400 600
10   b   200       `a`b`c!300 200 600
11   c   100       `a`b`c!300 200 100