복붙노트

[SQL] 이동 평균 T-SQL의 계산

SQL

이동 평균 T-SQL의 계산

나는 이동 평균을 계산하기 위해 노력하고, SQL 서버 2008 R2와 함께 일하고 있습니다. 내보기의 각 레코드에, 나는 250 개 이전 레코드의 값을 수집 한 다음이 선택의 평균을 계산하고 싶습니다.

다음과 같이 내보기 열은 다음과 같습니다 :

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), 이들의 평균값의 결과를 작성 MovAvg 모든 이전의 행 (250)의 값 (보기는 TransactionId으로 분류 하강) 한 후 컬럼에 수집. 나는 기록의 범위 내에서 수집 된 데이터를 찾고 있어요.

해결법

  1. ==============================

    1.SQL 2008에서의 윈도우 함수 오히려 이후 버전에 비해 제한되고 당신은 파티션 및 모든 행 / 범위 프레임 제한을 사용할 수 있습니다 올바른 기억하지만 난 생각한다면이 당신이 원하는 수 있습니다 :

    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
    

    이 모든 행과 성능에 상관 하위 쿼리를 적용됩니다 위대한하지 않을 수 있습니다.

    이후 버전을 사용하면 사용 윈도우 프레임 기능과 같은 완료 뭔가를 할 수 :

    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
    
  2. ==============================

    2.당신이 평균을 계산하기 이전 값을 얻을 수 있도록 각 트랜잭션에 대한 ROWNUM을 포함하는 공통 테이블 식 (CTE)를 사용하여, 다음 행 번호 자체에 대해 CTE에 가입.

    당신이 평균을 계산하기 이전 값을 얻을 수 있도록 각 트랜잭션에 대한 ROWNUM을 포함하는 공통 테이블 식 (CTE)를 사용하여, 다음 행 번호 자체에 대해 CTE에 가입.

    CREATE TABLE MyTable (TransactionId INT, Value INT)
    
    ;with Data as
    (
      SELECT TransactionId, 
             Value, 
             ROW_NUMBER() OVER (ORDER BY TransactionId ASC) as rownum
      FROM MyTable
    )
    SELECT d.TransactionId , Avg(h.Value) as MovingAverage
    FROM Data d
    JOIN Data h on h.rownum between d.rownum-250 and d.rownum-1
    GROUP BY d.TransactionId 
    
  3. from https://stackoverflow.com/questions/26618353/t-sql-calculate-moving-average by cc-by-sa and MIT license