kdb - 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)
解决方案
一种简洁的方法可能是:
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
方法应该与表格中日期的过滤器一起使用
推荐阅读
- c++ - 在递归调用之前或之后填充颜色(Flood Fill 算法)
- python-3.x - 为什么列表索引有不同的结果?
- javascript - 当我使用 Axios.create 访问 api 时,Response.data 为空,但是当我使用 axios.post 时它会给出响应
- laravel - 尝试安装 laravel 发条,但我有一个错误,即 Install of itsgoingd/clockwork failed
- google-cloud-platform - 没有为项目创建 API 密钥?
- reactjs - 反应中的自定义下拉菜单
- sql - 在重新测试日期前 60 天检索数据
- html - 如何在表 td 中包装数据列
- flutter - 未找到材质小部件。英雄动画不适用于 TextField
- rust - rust solana 构建错误:没有这样的子命令:+bpf