请问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行)。
SQL的分组计算中,一条记录只能属于一个组,不能满足问题中的要求。DolphinDB中的窗口关联(window join)允许窗口之间有重叠,可以实现你的需求。window join允许指定一个窗口的相对起始范围,对于左表中的任何一个时间点,在右表中根据相对窗口范围确定实际窗口。如果左表的时间是分钟间隔(也就是60000毫秒),那么只要把相对窗口范围设成-60000:0即可,这样两个相邻时间窗口的最后一条记录是重叠的。完整的代码如下:
这儿,我们动态生成左表。左表就一个字段,也就是每一分钟的最后一个时间点(最后1毫秒)。输出的时候输出窗口的开始时间,也即每一分钟的开始时间。注意,我们使用了pwj而不是wj,这是因为实践中每个窗口的最后一条记录,未必落在最后一个时间点上。wj精确匹配窗口的起始时间,pwj如果在指定的窗口开始时间上找不到记录,则会找到最近的一条记录。