kdb如何计算滚动计数

kdb如何计算滚动计数,kdb,Kdb,假设我有一个事件表,带有时间戳和类型 t1, 'b' t2, 'x' t3, 's' t4, 'b' 我怎样才能得到一个滚动计数,这样它就可以给我一个所有时间戳的列表,以及到taht ts的累计事件数,有点像总和的计数版本 for example for 'b' I d like a table 't1', 1 't2', 1 't3', 1 't4', 2 这里有一种方法可以做到这一点,尽管可能有一种更聪明的方法可以使用总和: //table definition tab:([]a:`t

假设我有一个事件表,带有时间戳和类型

t1, 'b'
t2, 'x'
t3, 's'
t4, 'b'
我怎样才能得到一个滚动计数,这样它就可以给我一个所有时间戳的列表,以及到taht ts的累计事件数,有点像总和的计数版本

for example for 'b' I d like a table

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

这里有一种方法可以做到这一点,尽管可能有一种更聪明的方法可以使用总和:

//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:
放在
总和前面

单向:

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开始。它与您的req“达到该ts的事件数”一起使用。如果您需要1,只需添加1'1+直到计数i'。同时确保您的时间已排序,以便在开始序列时有意义。

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