2017-02-22 35 views
1

Я хотел бы возвращать скользящие 12-месячные средние значения для каждого месяца в результирующем наборе данных, но я не уверен, как я могу это сделать.T-SQL - Rolling 12 Month Average

Я думал, что следующий сценарий будет работать:

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 года был бы средним с 01 февраля 2016 года по 31 января 2017 года и октябрем 2016 года - с 01 ноября 2015 года по 31 октября 2016 года.

Надеюсь, вы сможете помочь :-).

+1

, пожалуйста, покажите ожидаемый результат, фактический результат и DDL, чтобы воспроизвести проблему. – TheGameiswar

+0

пометьте версию SQLServer, которую вы используете как. Посмотрите здесь, например: https: //spaghettidba.com/2015/04/24/how -to-post-at-sql-question-on-a-public-forum/ – TheGameiswar

+0

Если вы находитесь на SQL 2012+, это то, что вам нужно: https://www.simple-talk.com/sql/t- sql-programming/calculate-values-in-a-roll-window-in-transact-sql/ – RoundFour

ответ

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-месячный период обратного отсчета. В другом случае, в обратном порядке не будут включать месяцы до этого периода.

+0

Благодарю вас, в этом случае первая средняя 12-месячная средняя будет 12-й строкой в ​​наборе данных, так как 11-я будет средней из предыдущих 11 строк, а пятая будет средним значением для первых 5 строк. – msinghm

+0

@msinghm. , , Да. Вот как это будет работать. –

+0

большое спасибо, это работает отлично. Я просто добавил OFFSET 12 ROWS; в конце и запустите 12 месяцев раньше желаемой даты, и это работает для меня. Большое спасибо. – msinghm