kdb q-2个日期之间的计数子表

时间:2018-08-24 12:39:27

标签: kdb

我有一张桌子

t:`date xasc ([]date:100?2018.01.01+til 100;price:100?til 100;acc:100?`a`b)

,并希望在t中有一个新列,其中包含t中条目的计数,其中date在前14天的日期范围内,并且帐户是相同的像acc中一样。例如,如果有

date       price    acc prevdate    prevdate1W   countprev14
2018.01.10  37       a  2018.01.09  2018.01.03   ?

然后,countprev14应该包含2018.01.032018.01.09之间的观察数,其中acc=a

我目前的操作方式可能会得到改善:

f:{[dates;ac;t]count select from t where date>=(dates 0),date<=(dates 1),acc=ac}[;;t]
(f')[(exec date-7 from t),'(exec date-1 from t);exec acc from t]

感谢您的帮助

2 个答案:

答案 0 :(得分:5)

我认为您正在寻找这样的东西:

update count14:{c-0^(c:sums 1&x)y bin y-14}[i;date] by acc from t

这使用sums获取运行计数,bin查找14天之前的运行计数,然后索引回运行计数列表以获取该日期的计数。

当时与现在之间的计数差是最近14天的计数。

请注意,这里的lambda允许我们轻松存储sums的结果,并避免不必要的重新计算。

答案 1 :(得分:5)

另一种方法是使用窗口联接(wj1): https://code.kx.com/q/ref/joins/#wj-wj1-window-join

dates:exec date from t; 
d:(dates-7;dates-1);
wj1[d;`acc`date;t;(`acc`date xasc t;(count;`i))]