我有一个数据库,其中旅行时间按时期划分,并在5分钟的垃圾箱中完成,我需要总计最多15分钟。这很棘手,因为数据是按TMC值,日期和时期划分的。这些都不是唯一的。就这样:
TMC DATE EPOCH Travel_TIME_ALL_VEHICLES
111N20176 7012015 64 63
111N20176 7012015 76 112
111N20176 7012015 80 114
111N20176 7012015 83 127
111N20176 7012015 91 58
111N20176 7012015 93 117
我需要将前三个旅行时间加在一起,然后是接下来的三个,然后是接下来的三个,依此类推。
select *, sum(Travel_TIME_ALL_VEHICLES) over (order by EPOCH rows between 3 preceding and current row) as rolling_avg
from [dbo].[FHWA_2015_weekend]
WHERE TMC = '113P12373' order by DATE, EPOCH
答案 0 :(得分:0)
在MySQL中(因为问题最初被标记),您可以使用变量枚举数据,然后进行聚合。
对于您的样本数据,这应该有效:
select tmc, date, sum(Travel_TIME_ALL_VEHICLES)
from (select t.*, (@rn := @rn + 1) as rn
from t cross join
(select @rn := 0) params
order by date, epoch
) t
group by tmc, date, floor((@rn - 1) / 3);
在几乎任何其他数据库中,您都会使用row_number()
来实现此目的:
select tmc, date, sum(Travel_TIME_ALL_VEHICLES)
from (select t.*, row_number() over (order by date, epoch) as rn
from t
) t
group by tmc, date, floor((rn - 1) / 3);