更改功能性 qSQL 查询以在计算 KDB+/Q 中涉及多个列

Changing a functional qSQL query to involve multiple columns in calculation KDB+/Q

我有一个?像这样执行查询:

t:([]Quantity: 1 2 3;Price 4 5 6;date:2020.01.01 2020.01.02 2020.01.03);
?[t;enlist(within;`date;(2020.01.01,2020.01.02));0b;(enlist `Quantity)!enlist (sum;(`Quantity))]

获取给定日期范围内数量的总和。我想调整它以获得日期范围内 Notional 的总和;数量*价格。所以结果应该是 (1x4)+(2x5)=14.

我试过类似下面的方法

?[t;enlist(within;`date;(2020.01.01,2020.01.02));0b;(enlist `Quantity)!enlist (sum;(`Price*`Quantity))]

但无法正常工作。任何建议将不胜感激!

我会建议在这种情况下考虑您正在寻找的 qSql 样式查询,然后从那里开始工作。

所以在这种情况下,我相信你正在寻找做类似的事情:

select sum Quantity*Price from t where date within 2020.01.01 2020.01.02

然后您可以 运行 对此进行解析,将其分解为函数形式,即 ?您引用的执行查询。

    q)parse"select sum Quantity*Price from t where date within 2020.01.01 2020.01.02"
?
`t
,,(within;`date;2020.01.01 2020.01.02)
0b
(,`Quantity)!,(sum;(*;`Quantity;`Price))

这是您需要的函数形式; table、where 子句、by 和聚合。

你可以看到你这里的数量只是两列相乘的总和。

q)?[t;enlist(within;`date;(2020.01.01;2020.01.02));0b;enlist[`Quantity]!enlist(sum;(*;`Quantity;`Price))]
Quantity
--------
14

如果您愿意,您也可以扩展它以根据需要更改列并为其创建一个函数:

q)calcNtnl:{[sd;ed] ?[t;enlist(within;`date;(sd;ed));0b;enlist[`Quantity]!enlist(sum;(*;`Quantity;`Price))]}
q)calcNtnl[2020.01.01;2020.01.02]
Quantity
--------
14