将日期范围拆分成块以重新加入一个 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/)
加入结果
我有一个 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/)