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

ten*_*con 1 kdb

我有一张桌子

t:`date xasc ([]date:100?2018.01.01+til 100;price:100?til 100;acc:100?`a`b)
Run Code Online (Sandbox Code Playgroud)

并希望有一个新的列在t其中包含的条目数t,其中date是在以前的14天日期范围和帐户是一样的acc.例如,如果有一行

date       price    acc prevdate    prevdate1W   countprev14
2018.01.10  37       a  2018.01.09  2018.01.03   ?
Run Code Online (Sandbox Code Playgroud)

那么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]
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助

Rya*_*ron 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轻松地存储结果并避免不必要的重新计算.


小智 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))]
Run Code Online (Sandbox Code Playgroud)