计算每n条记录SQL

时间:2017-11-09 02:50:18

标签: sql tsql sql-server-2008-r2

我有下表:

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

该表每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

SUM的{​​{1}}取自之前的5条记录,依此类推 有谁知道如何实现这个目标?

谢谢。

2 个答案:

答案 0 :(得分:1)

以下是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 Server中,您可以使用窗口函数来实现此目的。

答案 1 :(得分:0)

只需将表连接到自身,然后按主时间戳分组

以下内容很容易调整,包括你想要多少分钟。处理频率的变化,即不假设需要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