首页 > 解决方案 > q/kdb+ 中的 WTD、MTD、YTD 查询,带有 by 子句

问题描述

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)

标签: kdb

解决方案


一种简洁的方法可能是:

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日期是基于这样的假设,即如果一个人有一个日期的记录,那么他们都会。它还允许它在任何历史日期上工作以获取时间点视图。

如果不是这种情况,那么对于当前视图,使用今天.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方法应该与表格中日期的过滤器一起使用


推荐阅读