q/kdb和x2B中的WTD、MTD、YTD查询;附随条款

q/kdb和x2B中的WTD、MTD、YTD查询;附随条款,kdb,Kdb,希望得到WTD、MTD、YTD按名称求和的PnL,以生成以下结果 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) 例如,下面给出了时间-日期间隔,我无法让查询工作(与bin和xbar混淆)以生成最终结果 q)result:([`john`mary]WTD:10 10;MTD:20 20;YTD:30 20

希望得到WTD、MTD、YTD按名称求和的PnL,以生成以下结果

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)
例如,下面给出了时间-日期间隔,我无法让查询工作(与bin和xbar混淆)以生成最终结果

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

一种简洁的方法可能是:

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

q)ytd:("d"$12 xbar "m"$.z.d;.z.d)
此处使用的
max
date是基于这样的假设,即如果一个人在某个日期有记录,那么他们都会有。它还允许它在任何历史日期工作,以获得时间点视图

如果不是这样,那么对于当前日期视图,最好使用今天的日期
.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

如果您的数据很稀疏,并且不是每个人都有每个日期的记录,但您仍然希望有一个历史性的星期到日期、月到日期、年到日期,那么我认为最好的办法是“取消共享”表,这样每个名称在每个日期都有一个记录,如果需要,用零pnl填充。然后,
max
方法应该与表中日期的过滤器一起工作

它是关于什么的?你的问题是什么,背景是什么,你在尝试什么,你遇到了什么问题(错误?)吗?嗨,特里,回答得很好!我想要的,真的很感激。我认为,如果我们将表格改为:res:([]日期:2020.01.01 2020.05.01 2020.05.03 2020.05.26 2020.05.28;pnl:10;name:
john
mary
john
john`john)现在mary应该没有WTD pnl-但你的答案不是这样,它似乎用MTD数字填充了它,不知道为什么,但我认为仅仅改变字典中要使用的where子句,似乎就可以解决这个问题了..啊哈-这是max x,这是个问题,只需要将其替换为.z.d:)是的,观察得很好。使用
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});