T-SQL - 滚动12个月平均值

时间:2017-02-22 11:54:15

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

我想在结果数据集中返回每月滚动12个月的平均值,但我不确定如何执行此操作。

我认为以下脚本可行:

DECLARE @StartDate as datetime
DECLARE @EndDate as datetime
SET @StartDate = '01/04/2011'
SET @EndDate = getdate()

select x.FinYear, x.FinMonth, x.MonthText, avg(TimeSeconds) [AverageTimeSeconds]
from times x
where (x.TimeOfCall >= @StartDate and x.TimeOfCall < @EndDate)
group by x.FinYear, x.FinMonth, x.MonthText
order by x.FinYear, x.FinMonth

但它只返回月平均值,如何获得12个月平均值,直至开始日期和结束日期之间的每个月。

我要查找的结果数据集如下:

Fin Year    Fin Month   Month Text  Avg Time Seconds    R12M Avg Seconds
2015/16 01  Apr 100 101
2015/16 02  May 95  98
2015/16 03  Jun 103 100
2015/16 04  Jul 110 100
2015/16 05  Aug 100 100
2015/16 06  Sep 90  97
2015/16 07  Oct 93  97
2015/16 08  Nov 98  100
2015/16 09  Dec 80  98
2015/16 10  Jan 88  98
2015/16 11  Feb 100 98
2016/17 12  Mar 115 100
2016/17 01  Apr 105 100
2016/17 02  May 98  100
2016/17 03  Jun 95  98
2016/17 04  Jul 102 98
2016/17 05  Aug 109 99
2016/17 06  Sep 104 100
2016/17 07  Oct 98  98
2016/17 08  Nov 99  97
2016/17 09  Dec 90  97

滚动的12个月平均值不是月平均值的平均值,而是导致该月的12个月的平均值。因此,2017年1月将是​​2016年2月1日 - 2017年1月31日和2016年10月的平均值,即2015年11月1日至2016年10月31日。

我希望你能帮忙:-)。

1 个答案:

答案 0 :(得分:1)

如果您有每个月的数据,那么以下计算前12个月的平均值(请注意这是整体平均值,而不是月平均值的平均值):

select x.FinYear, x.FinMonth, x.MonthText, avg(TimeSeconds)as [AverageTimeSeconds],
       (sum(sum(TimeSeconds)) over (order by x.FinYear, x.FinMonth rows between 11 preceding and current row) /
        sum(count(*)) over (order by x.FinYear, x.FinMonth rows between 11 preceding and current row)
       ) as avg_12month
from times x
where x.TimeOfCall >= @StartDate and x.TimeOfCall < @EndDate
group by x.FinYear, x.FinMonth, x.MonthText
order by x.FinYear, x.FinMonth;

注意:where子句会影响12个月的回顾期。更糟糕的是,回顾将不包括此期间之前的几个月。