15

이동 평균을 계산하려고 SQL Server 2008 R2에서 작업하고 있습니다. 내보기의 각 레코드에 대해 250 개의 이전 레코드 값을 수집하고이 선택의 평균을 계산하고 싶습니다.T-SQL 이동 평균 계산

TransactionID | TimeStamp   | Value | MovAvg 
---------------------------------------------------- 
      1 | 01.09.2014 10:00:12 |  5 |  
      2 | 01.09.2014 10:05:34 |  3 | 
... 
      300 | 03.09.2014 09:00:23 |  4 | 

TransactionID이 고유 다음과 같이

내보기 열입니다. 각 TransactionID에 대해 이전 250 개 레코드에 대한 평균 값을 계산하고 싶습니다. 따라서 TransactionID 300의 경우 이전 250 행 (View는 TransactionID에 따라 내림차순 정렬 됨)의 모든 값을 수집 한 다음 MovAvg 열에서이 값의 평균 결과를 씁니다. 나는 다양한 기록 안에서 데이터를 수집하려고한다.

+2

'PARTITION BY' 및'ROW_NUMBER'을 확인하십시오. – Mihai

+0

감사합니다. 당신이 그것을하는 방법에 대한 제안을 가지고있는 기회? – RunW

+0

@RunW 동일한 트랜잭션 ID가 다른 값으로 반복됩니까? 트랜잭션 ID와 별도로 타임 스탬프 열 또는 ID 열이 있습니까? – radar

답변

20

SQL 2008의 창 기능은 이후 버전과 비교해 다소 제한적입니다. 올바른 기억이있는 경우에만 파티션을 만들 수 있으며 모든 행/범위 프레임 제한을 사용할 수 없지만 이것이 원하는 것일 수 있습니다.

;WITH cte (rn, transactionid, value) AS (
    SELECT 
     rn = ROW_NUMBER() OVER (ORDER BY transactionid), 
     transactionid, 
     value 
    FROM your_table 
) 

SELECT 
    transactionid, 
    value, 
    movagv = (
     SELECT AVG(value) 
     FROM cte AS inner_ref 
     -- average is calculated for 250 previous to current row inclusive 
     -- I might have set the limit one row to large, maybe it should be 249 
     WHERE inner_ref.rn BETWEEN outer_ref.rn-250 AND outer_ref.rn 
     ) 
FROM cte AS outer_ref 

모든 행에 상관 하위 쿼리가 적용되므로 성능이 좋지 않을 수 있습니다. 다음, 각 트랜잭션에 대한 ROWNUM을 포함하므로 행 번호 자체에 대해 CTE에 가입

SELECT 
    transactionid, 
    value, 
    -- avg over the 250 rows counting from the previous row 
    AVG(value) OVER (ORDER BY transactionid 
        ROWS BETWEEN 251 PRECEDING AND 1 PRECEDING), 
    -- or 250 rows counting from current 
    AVG(value) OVER (ORDER BY transactionid 
        ROWS BETWEEN 250 PRECEDING AND CURRENT ROW) 
FROM your_table 
+0

고맙습니다. 그것은 확실히 그것을하는 방법이지만, 당신이 말한대로, 그 성능은 상당히 나쁩니다. 당신의 도움을 주셔서 감사합니다. – RunW

+0

SQL 2008에서 모든 행에 상관 된 하위 쿼리를 실행하지 않는보다 효율적인 방법이 있습니까? 나는 내 두뇌를 열심히 시도해 내 실행 시간을 떨어 뜨리는 해결책을 생각해 냈지만 나는 그만큼 짧아지고있다. – mitchimus

+0

@mitchimus있을 수도 있지만 어떤 것도 알지 못합니다. 이후 버전의 서버에서는 더 나은 옵션이 있으므로 생각하지 않았습니다. – jpw

5

사용하십시오 Common Table Expression (CTE) : 당신은 윈도우 프레임 기능을 사용하고 이런 식으로 뭔가를 할 수 있었다 최신 버전으로

이전 값을 가져와 평균을 계산할 수 있습니다.