KDB+/Q中循环赋值一定数量的名称和参数不规则的变量

Looping in KDB+/Q to assign a certain number of variables with irregular names and parameters

我有一组变量赋值,如下所示,我需要以某种方式概括它们。

bar1Q19:exec sum Quantity from table where date within (2019.01.01,2019.03.31)
bar2Q19:exec sum Quantity from table where date within (2019.04.01,2019.06.30)
...
bar3Q21:exec sum Quantity from table where date within (2021.07.01,2021.06.30)
bar4Q21:exec sum Quantity from table where date within (2021.10.01,2021.12.31)

我正在编写一个最终将无人监督的脚本,并且在每个季度末都需要仅分配过去 8 个季度的那些变量。我是 KDB+/Q 的新手,所以不得不使用 over 和 scan 而不是循环让我很困惑。

我在结构上考虑,做一个 if 语句来检查当前月份(我有一个变量)在哪个季度,然后使用循环从那个季度向后工作可能是有意义的,但这要容易得多对我来说是描述而不是实际实施。任何关于如何开始的想法都将不胜感激!

要查找过去 8 个季度的相关日期,您可以使用此函数:

q){reverse("d"$(-3*til y)+m),'-1+"d"$(-3*-1+til y)+m:3 xbar"m"$x}[.z.d;8]
2020.01.01 2020.03.31
2020.04.01 2020.06.30
2020.07.01 2020.09.30
2020.10.01 2020.12.31
2021.01.01 2021.03.31
2021.04.01 2021.06.30
2021.07.01 2021.09.30
2021.10.01 2021.12.31

其中 x 是当前日期,y 是您要查找的季度数。

使用它,您可以使用功能执行程序计算每个季度的总数量。函数式 exec 在这里很有用,因为我们想将日期列表作为变量传递给函数。

q)dts:{reverse("d"$(-3*til y)+m),'-1+"d"$(-3*-1+til y)+m:3 xbar"m"$x}[.z.d;8]
q)totals:{[r]?[table;enlist(within;`date;r);();(sum;`Quantity)]}each dts

如果您的数据库是分区的,您将需要使用不同的查询,因为 exec 不适用于分区数据库。这样的事情应该有效:

totals:raze{exec Quantity from?[table;enlist(within;`date;x);0b;(enlist`Quantity)!enlist(sum;`Quantity)]}each dts

totals 将是一个 8 项列表。从这里您可以使用字典来分配条形图,如下所示:

q)`bar1`bar2`bar3`bar4`bar5`bar6`bar7`bar8!totals