kdb如何计算滚动计数

时间:2017-05-16 09:05:05

标签: kdb

假设我有一个事件表,包含Timestamp和Type。

for example for 'b' I d like a table

't1', 1
't2', 1
't3', 1
't4', 2

如何获得滚动计数,以便它能够为我提供所有时间戳的列表以及最多为taht ts的累计事件数量,有点像总和的计数版本

 i.llE etc (str = chr)

3 个答案:

答案 0 :(得分:1)

这是一种方法,虽然可能有更聪明的方式使用总和:

//table definition
tab:([]a:`t1`t2`t3`t4;b:"bxsb")

//rolling sum of 1 by column b
update sums count[i]#1 by b from tab 

结果:

a  b x
------
t1 b 1
t2 x 1
t3 s 1
t4 b 2

如果您想要替换b,则只需将b:放在sums前面。

答案 1 :(得分:1)

一种方式:

q)t:([]p:asc 4?.z.p+til 1000;t:`b`x`s`b)
q)asc `p xcols ungroup select p,til count i by t from t
p                             t x
---------------------------------
2017.05.16D09:42:48.259062090 b 0
2017.05.16D09:42:48.259062585 x 0
2017.05.16D09:42:48.259062683 s 0
2017.05.16D09:42:48.259062858 b 1

Ps:注意我已经开始将序列设为0,就像说"我在此行之前有0个事件"而不是按照你的例子从1开始。这与你的需求相关"直到那个"的事件数量。如果您需要1,只需添加1' 1 +直到计数i'。同时确保您的时间排序,以便在开始序列时有意义。

答案 2 :(得分:1)

使用表格t,如下所示:

q)show t: ([]ts:.z.t - desc "u"$(til 4);symb:`b`x`z`b)
ts           symb
-----------------
09:46:56.384 b
09:47:56.384 x
09:48:56.384 z
09:49:56.384 b

使用矢量条件:

q)select ts, cum_count:sums ?[symb=`b;1;0] from t
ts           cum_count
----------------------
09:46:56.384 1
09:47:56.384 1
09:48:56.384 1
09:49:56.384 2

相同,但使用symb作为参数的函数:

q){select ts, cum_count:sums ?[symb=x;1;0] from t}[`b]
ts           cum_count
----------------------
09:46:56.384 1
09:47:56.384 1
09:48:56.384 1
09:49:56.384 2

事实上,你不需要有条件的向量,因为你可以直接对布尔值求和:

q){select ts, cum_count:sums symb=x from t}[`b]
ts           cum_count
----------------------
09:46:56.384 1
09:47:56.384 1
09:48:56.384 1
09:49:56.384 2