2016-06-29 4 views
0

Benötigen Rollender-Durchschnitt3 Monate für 3 Spalten

helfen

Eingangs

Date  A   B  C 
2015-10-31 1.49  3.7  7.8 
2015-11-30 1.45  3.6  7.6 
2015-12-31 1.41  3.7  8.0 
2016-01-31 1.33  3.7  8.3 
2016-02-29 1.29  4.1  8.6 
2016-03-31 1.46  4.4  9.7 

TABLE dbo.ThreeMonth CREATE (Rdate DATE, einen Schwimmer, b FLOAT, C FLOAT)

INSERT in DBO. 3 Monate (rdate, a, b, c) VALUES ('2015.10.31', 1,49, 3.7,7.8) INSERT in dbo.threemonth (rdate, a, b, c) VALUES (‚2015- 11-30 ', 1.45, 3.6, 7, 6)

INSERT in dbo.threemonth (Rdate, a, b, c) VALUES ('2015-12-31', 1,41, 3.7,8.0)

INSERT in dbo.threemonth (Rdate, a , b, c) VALUES ('2016.01.31', 1,33, 3.7,8.3)

INSERT in dbo.threemonth (rdate, a, b, c) VALUES (‚2016.02.29 ', 1.9, 4.1,8.6)

INSERT in dbo.threemonth (RDate, a, b, c) VALUES ('2016.03.31', 1,46, 4.4,9.7)

INSERT in dbo.threemonth (Rdate, a, b, c) VALUES ('2016.04.30', 1,35, 4,3 , 9.4)

SELECT * FROM 3 Monate

--Tried die folgende Abfrage

select rdate, avg (A)
OVER ( ORDER BY rdate Reihen zwischen 2 und CURRENT ROWVORHERGEHENDEN) VON 3 Monate

OutPut

Ich brauche 3-Monats-Durchschnitt für 3 Spalten a, b, um Rollen, c .WHEN I AVG ADD (b) und AVG (c) es gibt ERROR

"Spalte" threemonth.RDate 'ist in der Auswahlliste ungültig, da sie weder in einer Aggregatfunktion noch in der GROUP BY-Klausel enthalten ist. "

--Also Ich möchte die Ausgabe im Format folgenden

2015-10-31 NULL -- Because 3 months are not available avg cannot be calculated 
2015-11-30 NULL -- Because 3 months are not available avg cannot be calculated 
2015-12-31 1.45 
2016-01-31 1.39666666666667 
2016-02-29 1.54666666666667 
2016-03-31 1.56333333333333 
2016-04-30 1.57 code here 

Kann jemand raten, um das obige Problem zu lösen, WO ICH AVG nehmen müssen für mehr als 1 Spalte und Ausgangsanzeige in dem Format I oben gezeigt haben, FÜR ALLE 3 SPALTEN?

Antwort

0

Somthing gefällt das

;with cteBase as (SELECT *,RowNr = Row_Number() Over (Order by RDate) FROM threemonth) 
    Select RDate,Avg=(select Avg(A) from cteBase where RowNr between A.RowNr-2 and A.RowNr and A.RowNr>2) 
    From cteBase A 

Returns

RDate  Avg 
2015-10-31 NULL 
2015-11-30 NULL 
2015-12-31 1.45 
2016-01-31 1.39666666666667 
2016-02-29 1.54666666666667 
2016-03-31 1.56333333333333 
2016-04-30 1.57 

Für Cols A, B, und C

;with cteBase as (SELECT *,RowNr = Row_Number() Over (Order by RDate) FROM threemonth) 
    Select RDate 
     ,AvgA=(select Avg(A) from cteBase where RowNr between A.RowNr-2 and A.RowNr and A.RowNr>2) 
     ,AvgB=(select Avg(B) from cteBase where RowNr between A.RowNr-2 and A.RowNr and A.RowNr>2) 
     ,AvgC=(select Avg(C) from cteBase where RowNr between A.RowNr-2 and A.RowNr and A.RowNr>2) 
    From cteBase A 
+0

Dank. Kannst du mir helfen, wenn ich avg für Spalte b und Spalte c hinzufügen möchte? – user1143726

+0

Meine Antwort wurde aktualisiert, um Col B und A einzuschließen –