分组计算时要包含前一组的最后一条记录,怎么实现

请问DolphinDB database中group by的时候,有没有什么办法能让上一个组的最后一个条目也被分到下一个组,成为下一个组的第一个条目?即前后两个组之间有一定的overlap?

分组字段是时间类型,且行已按照时间排序,比如下面表:

t= table(concatDT(today(), 09:30:00.001 09:30:59.999 09:31:00.000 09:31:25.812 09:32:01.001 09:32:40.021) as timestamp, 1..6 as vol)

它的数据如下:

timestamp                 vol
2020.07.20T09:30:00.001    1
2020.07.20T09:30:59.999    2
2020.07.20T09:31:00.000    3
2020.07.20T09:31:25.812    4
2020.07.20T09:32:01.001    5
2020.07.20T09:32:40.021    6

现在希望用 bar 对 time 按分钟分组后,得到下面结果:

windowStart                sum_vol
2020.07.20T09:30:00.000     3
2020.07.20T09:31:00.000     9
2020.07.20T09:32:00.000     15

即第2组用到了第1组的最后一行(表中第2行),第3组用到了第2组的最后一行(表中第4行)。

阅读 1.8k
1 个回答

SQL的分组计算中,一条记录只能属于一个组,不能满足问题中的要求。DolphinDB中的窗口关联(window join)允许窗口之间有重叠,可以实现你的需求。window join允许指定一个窗口的相对起始范围,对于左表中的任何一个时间点,在右表中根据相对窗口范围确定实际窗口。如果左表的时间是分钟间隔(也就是60000毫秒),那么只要把相对窗口范围设成-60000:0即可,这样两个相邻时间窗口的最后一条记录是重叠的。完整的代码如下:

t= table(concatDT(today(), 09:30:00.001 09:30:59.999 09:31:00.000 09:31:25.812 09:32:01.001 09:32:40.021) as timestamp, 1..6 as vol)
timeBar = bar(t.timestamp, 60000).distinct().sort() + 60000 - 1
select bar(timeBar, 60000) as windowStart, sum_vol from pwj(table(timeBar), t, -60000:0, <sum(vol)>, `timeBar, `timestamp)

这儿,我们动态生成左表。左表就一个字段,也就是每一分钟的最后一个时间点(最后1毫秒)。输出的时候输出窗口的开始时间,也即每一分钟的开始时间。注意,我们使用了pwj而不是wj,这是因为实践中每个窗口的最后一条记录,未必落在最后一个时间点上。wj精确匹配窗口的起始时间,pwj如果在指定的窗口开始时间上找不到记录,则会找到最近的一条记录。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进