计算每 n 条记录 SQL

Calculate Every n record SQL

我有以下 table:

oDateTime                oValue
------------------------------------
2017-09:30 23:00:00      8
2017-09-30 23:15:00      7
2017-09-30 23:30:00      7
2017-09-30 23:45:00      7
2017-10-01 00:00:00      6
2017-10-01 00:15:00      5
2017-10-01 00:30:00      8
2017-10-01 00:45:00      7
2017-10-01 01:00:00      6
2017-10-01 01:15:00      9
2017-10-01 01:30:00      5
2017-10-01 01:45:00      6
2017-10-01 02:00:00      7

table每15分钟会有一条记录。我想每 15 分钟 SUMAverage 这些记录。
所以,结果应该是:

oDateTime                Sum_Value      Avg_Value
---------------------------------------------------
2017-10-01 00:00:00      35             7
2017-10-01 01:00:00      32             6.4
2017-10-01 02:00:00      33             6.6

2017-10-01 00:00:00SUM 取自它之前的 5 条记录,依此类推。
有谁知道如何做到这一点?

谢谢。

这是 SQL Server 2008 中的一种方法:

select t.oDateTime, tt.sum_value, tt.avg_value
from (select oDateTime
      from t
      where datepart(minute, oDateTime) = 0
     ) t outer apply
     (select sum(oValue) as sum_value, avg(oValue) as avg_Value
      from (select top 5 t2.*
            from t t2
            where t2.oDateTime <= t.oDateTime
            order by t2.oDateTime desc
           ) tt
     ) tt;

在较新版本的 SQL 服务器中,您可以使用 window 函数来实现此目的。

只需将 table 加入自身,并按主时间戳分组

下面的这个很容易调整table,包括你想要多少分钟。处理频率变化,即不假设需要 5 行,因此如果数据以 5 分钟的间隔传入,则会处理。

select cast('2017-09-30 23:00:00' as datetime) t,8  o
into #a
union all
select '2017-09-30 23:15:00',7 union all
select '2017-09-30 23:30:00',7 union all
select '2017-09-30 23:45:00',7 union all
select '2017-10-01 00:00:00',6 union all
select '2017-10-01 00:15:00',5 union all
select '2017-10-01 00:30:00',8 union all
select '2017-10-01 00:45:00',7 union all
select '2017-10-01 01:00:00',6 union all
select '2017-10-01 01:15:00',9 union all
select '2017-10-01 01:30:00',5 union all
select '2017-10-01 01:45:00',6 union all
select '2017-10-01 02:00:00',7 

select x.t,sum(x2.o),avg(cast(x2.o as float))
from   #a x, #a x2
where  x2.t between dateadd(mi,-60,x.t) and x.t 
group by x.t