2014-12-02 2 views
2

그래서 위치 ID, 연도 및 높이라는 세 개의 열이 있습니다.SQL Server 2012에서 null이있는 평균 이동

5 년 평균을 계산하고 싶습니다. 그러나 5 년 분량의 데이터가 없으면 결과가 필요하지 않습니다.

나는 OVER를 사용하는 방법에 대해 배웠다. 이 주제를 다루는 다른 질문을 보았지만 문제에 대한 해결책을 찾을 수 없었습니다.

select locationID, year_num, height_num2, 
     avg(cast(height_num2 as float)) over (PARTITION BY locationID 
               ORDER BY year_num 
               ROWS 4 PRECEDING) as FiveYearRollingAverage 
from combined; 

을 그리고 지금은 가장이 접근하는 방법에 난처한 해요 : 내가 어디에 서 여기

입니다.

답변

3

평균에 관련된 레코드 수를 알기 위해 카운터를 추가해야한다고 생각합니다.

locationID year_num FiveYearRollingAverage 
---------------------------------------------- 
1   2013   3 
1   2014   4,2 

가있다 :이 입력으로

SELECT locationID, year_num, FiveYearRollingAverage 
FROM (
SELECT locationID, year_num, 
     AVG(CAST(height_num2 AS FLOAT)) OVER (PARTITION BY locationID ORDER BY year_num ROWS 4 PRECEDING) FiveYearRollingAverage, 
     COUNT(*) OVER (PARTITION BY locationID ORDER BY year_num ROWS 4 PRECEDING) yearsCount 
FROM @combined) u 
WHERE u.yearsCount = 5 

:이 출력을

DECLARE @combined TABLE (locationID INT, year_num INT, height_num2 INT) 

INSERT @combined VALUES 
(1, 2009, 1), 
(1, 2010, 4), 
(1, 2011, 3), 
(1, 2012, 2), 
(1, 2013, 5), 
(1, 2014, 7), 
(2, 2014, 2), 
(2, 2015, 1), 
(2, 2016, 4), 
(2, 2017, 3) 

당신이 얻을가 5 인 경우에, 외부 쿼리를 사용하여 롤링 평균을 포함하는 레코드를 선택 이 ID에는 4 년 만 사용할 수 있으므로 locationID = 2에 대한 결과는 출력되지 않습니다.

+0

좋은 답변 – radar

관련 문제