将日期范围拆分成块以重新加入一个 table KDB+/Q

Split up date range into chunks to join back into one table KDB+/Q

我有一个 table 正在像这样加入

result: select from table where date within (sd;ed)

其中 sd 和 ed 跨越多个月(如 sd:2021.07.01 ed:2021.09.30)。如果您需要一个多月,我要查询的 table 就会中断,因此要获得我需要的结果,我必须执行以下操作:

result: uj(uj(select from table where date within (2021.07.01;2021.07.30);select from table where date within (2021.08.01;2021.08.31));select from table where date within (2021.09.01;2021.09.30))

如何为任何 sd 和 ed 设置动态?也就是说,我怎样才能将时间范围分成几个月的第一天、几个月的最后几天,并将它们全部加入一个 table 中?我最初的想法是将天数划分为 x 时间范围内的天数,由用户输入,然后将结果的天数添加到 sd 中以获得帧,但这变得混乱。

像这样的东西应该为你分块:

raze{select from t where date within x}each(first;last)@\:/:d group"m"$d:sd+til 1+ed-sd

不要按照您的建议使用where date.month=x——至少不要用于历史查询

将开始日期和结束日期转换为可迭代日期列表的一个选项可能是:

f:{0N 2#(x,raze -1 0+/:`date$mx+1+til(`month$y)-mx:`month$x),y}

其中 x 是开始日期,y 是结束日期。

f[2021.07.14;2022.02.09]
2021.07.14 2021.07.31
2021.08.01 2021.08.31
2021.09.01 2021.09.30
2021.10.01 2021.10.31
2021.11.01 2021.11.30
2021.12.01 2021.12.31
2022.01.01 2022.01.31
2022.02.01 2022.02.09

那么你可以运行:

{select from t where date within x} each f[sd;ed]

并使用 raze(uj/)

加入结果