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

请问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 个回答

logger

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如果在指定的窗口开始时间上找不到记录,则会找到最近的一条记录。





请先 登录 后评论