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