Запрос WTD, MTD, YTD в q / kdb + с условием by - PullRequest
0 голосов
/ 28 мая 2020
q)res:([]date:2020.01.01 2020.05.01 2020.05.03 2020.05.26 2020.05.28;pnl:10 10 10 10 10;name:`john`mary`john`john`mary)

Хотите получить WTD, MTD, YTD, суммированные PnL по имени, чтобы получить результат ниже

q)result:([`john`mary]WTD:10 10;MTD:20 20;YTD:30 20)

Итак, ниже, например, приведены интервалы времени и даты, я просто не могу получить запрос для работы (возиться с bin и xbar) для получения конечного результата

q)mtd:(`date$0 + `month$.z.d;.z.d)

q)ytd:("d"$12 xbar "m"$.z.d;.z.d)

1 Ответ

0 голосов
/ 28 мая 2020

Один краткий способ сделать это может быть:

d:`WTD`MTD`YTD!({sum y where x>=m-(m:max x)mod 7};{sum y where x>=`date$`month$max x};{sum y where x>="d"$12 xbar "m"$max x});

q)exec d .\:(date;pnl) by name:name from res
name| WTD MTD YTD
----| -----------
john| 10  20  30
mary| 10  20  20

Использование max date здесь основано на предположении, что если у одного человека есть запись о дате, то все будут. Это также позволило бы ему работать с любой исторической датой для просмотра на определенный момент времени.

Если это не так, то для просмотра текущего дня может быть лучше использовать сегодняшнюю дату .z.D в качестве момента времени, например,

d:`WTD`MTD`YTD!({sum y where x>=.z.D-.z.D mod 7};{sum y where x>=`date$`month$.z.D};{sum y where x>="d"$12 xbar "m"$.z.D});

Если ваши данные редкие, и не у всех есть записи на каждую дату, и все же вы все равно хотите исторические данные за неделю, месяц до даты, год до даты, тогда я думаю, что лучше всего было бы «разобрать» таблицу, например что каждое имя имеет запись на каждую дату, при необходимости заполненную нулевым номером pnl. Тогда подход max должен работать вместе с фильтром по датам в таблице

...