2017-02-22 10 views
1

Ich möchte rollende 12-Monats-Durchschnittswerte für jeden Monat in einem resultierenden Datensatz zurückgeben, bin mir aber nicht sicher, wie ich dies tun kann.T-SQL - Rolling 12-Monats-Durchschnitt

Ich dachte, das folgende Skript funktionieren würde:

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 

aber es gibt nur die Monatsmittelwerte, wie ich die 12-Monats-Durchschnitt führende bis zu jedem der Monate zwischen dem Start- und Enddatum erhalte.

Die resultierende Datenmenge die ich suche ist wie folgt:

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 

die rollierende 12 Monats-Durchschnitt nicht ein Durchschnitt des Monatsmittelwertes ist aber im Durchschnitt der letzten 12 Monate auf den betreffenden Monat führt. Also Januar 2017 wäre der Durchschnitt vom 1. Februar 2016 - 31. Januar 2017 und Oktober 2016 wäre 01. November 2015 bis 31. Oktober 2016.

Ich hoffe, Sie können helfen :-).

+1

Bitte zeigen Sie Ihr erwartetes Ergebnis, tatsächliche Ergebnismenge und DDL, um das Problem zu reproduzieren – TheGameiswar

+0

Tag die Version von SQLServer, die Sie auch verwenden.Sehen Sie hier zum Beispiel: https: //spaghettidba.com/2015/04/24/how -nach-sql-question-on-a-public-forum/ – TheGameiswar

+0

Wenn Sie auf SQL 2012+ sind, benötigen Sie Folgendes: https://www.simple-talk.com/sql/t- sql-programming/berechnungswerte-in-einem-rolling-window-in-transact-sql/ – RoundFour

Antwort

1

Wenn Sie Daten für jeden Monat, dann das folgende berechnet den Durchschnitt der letzten 12 Monate (beachten Sie, dies ist der Gesamtdurchschnitt, nicht der Durchschnitt der Monatsmittelwerte):

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; 

Hinweis: Die Klausel where wirkt sich auf die 12-monatige Rückschauperiode aus. In anderen Schlimmerem wird der Rückblick Monate vor diesem Zeitraum nicht enthalten.

+0

Danke, in diesem Fall wäre der erste rollende 12-Monats-Durchschnitt die 12. Zeile im Datensatz, da der 11. ein Durchschnitt der vorherigen 11 Zeilen wäre und der fünfte der Durchschnitt der ersten 5 Zeilen wäre. – msinghm

+0

@msinghm. . . Ja. So würde das funktionieren. –

+0

Vielen Dank, das funktioniert perfekt. Ich habe gerade den OFFSET 12 ROWS hinzugefügt; Klausel am Ende und führen Sie die 12 Monate früher als das gewünschte Datum und das funktioniert für mich. Vielen Dank. – msinghm