[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.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.당신이 평균을 계산하기 이전 값을 얻을 수 있도록 각 트랜잭션에 대한 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
from https://stackoverflow.com/questions/26618353/t-sql-calculate-moving-average by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 어떻게 SQLite는 쉼표로 구분 된 값을 분할하려면? (0) | 2020.05.26 |
---|---|
[SQL] 정확히 어떻게 사용 또는 MySQL의 문은 괄호없이 /와 다른 점은 무엇입니까? (0) | 2020.05.26 |
[SQL] 엔티티 프레임 워크 마이그레이션에 'GO'문을 추가 (0) | 2020.05.26 |
[SQL] sqlite가에서 DATETIME에서 달을 받기 (0) | 2020.05.26 |
[SQL] 오라클의 CONNECT BY ... START WITH에 해당하는 PostgreSQL의 구문은 무엇입니까? (0) | 2020.05.26 |