我想在结果数据集中返回每月滚动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日。
我希望你能帮忙:-)。
答案 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个月的回顾期。更糟糕的是,回顾将不包括此期间之前的几个月。