kdb q - посчитать подтаблицу между 2 датами - PullRequest
0 голосов
/ 24 августа 2018

у меня есть стол

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.03 до 2018.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 голосов
/ 24 августа 2018

Другой метод использует объединение окон (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))]
0 голосов
/ 24 августа 2018

Я думаю, вы ищете что-то вроде этого:

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

это использует sums, чтобы получить счетчики, bin, чтобы найти счетчик от 14дней до этого, а затем индексирует обратно в список текущих подсчетов, чтобы получить отсчеты с этой даты.

Разница между счетами тогда и сейчас - это те, что были получены за последние 14 дней.

Обратите внимание, что здесь лямбда-выражение позволяет нам легко сохранить результат из sums и избежать ненужных повторных вычислений.

...