假设我有一个事件表,包含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)
答案 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