Один краткий способ сделать это может быть:
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
должен работать вместе с фильтром по датам в таблице