2016-06-29 3 views
0

Нужна помощь3 месяца скользящее среднее за 3 колонки

входного

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 

CREATE TABLE dbo.ThreeMonth (RDate ДАТА, поплавком, б FLOAT, C FLOAT)

ВСТАВКУ в DBO. threemonth (RDate, а, б, в) ЗНАЧЕНИЯ ('2015-10-31', 1.49, 3.7,7.8) вставить в dbo.threemonth (RDate, a, b, c) VALUES («2015- 11-30 ', 1,45, 3,6, 7,6)

ВСТАВИТЬ в dbo.threemonth (RDate, а, б, в) ЗНАЧЕНИЯ ('2015-12-31', 1.41, 3.7,8.0)

ВСТАВИТЬ в dbo.threemonth (RDate, A , b, c) значения ('2016-01-31', 1.33, 3.7,8.3)

вставить в dbo.threemonth (RDate, а, б, в) ЗНАЧЕНИЯ («2016-02-29 , 1,9, 4,1,8,6)

ВСТАВИТЬ в dbo.threemonth (RDate, a, b, c) ЗНАЧЕНИЯ ('2016-03-31', 1.46, 4.4,9.7)

ВСТАВИТЬ в dbo.threemonth (RDate, а, б, в) ЗНАЧЕНИЯ ('2016-04-30', 1,35, 4,3 , 9.4)

SELECT * FROM threemonth

--Tried следующего запроса

выберите rdate, ср (А)
НАД ( ORDER BY rdate ЧСТРОК между 2 предшествующим и текущей строкой ) ОТ threemonth

Выходной

мне нужно отобразить прокатки 3 месяца среднем за 3 колонки а, Ь, с .Когда я ADD AVG (б) и AVG (с) он дает ошибку

«Столбец« threemonth.RDate »недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY».

--Also Я хочу выход в следующем формате

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 

Может кто-нибудь посоветовать, чтобы решить вышеуказанную проблему, когда мне нужно ПРИНЯТЬ AVG более чем за 1 КОЛОНКА И дисплей выводится в формате я показал выше ДЛЯ ВСЕХ 3 КОЛОНКИ?

ответ

0

Somthing как этот

;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 

Возвращения

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 

Для Cols A, B, и 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

Спасибо. Можете ли вы помочь, если я хочу добавить avg для столбца b и столбца c. – user1143726

+0

Обновлен мой ответ, чтобы включить Col B и A –

Смежные вопросы