복붙노트

[SQL] 어떻게 이동 평균 사용하여 MySQL을 계산합니까?

SQL

어떻게 이동 평균 사용하여 MySQL을 계산합니까?

내가 좋아하는 뭔가를 할 필요가 :

SELECT value_column1 
FROM table1 
WHERE datetime_column1 >= '2009-01-01 00:00:00' 
ORDER BY datetime_column1;

value_column1에 추가를 제외하고, 또한 value_column1의 이전 (20 개) 값의 이동 평균을 검색해야합니다.

표준 SQL은 바람직하지만 필요하다면 나는 MySQL의 확장 기능을 사용합니다.

해결법

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

    1.이것은 단지 내 머리 위로 떨어져 있으며,이 검증되지 않은, 그래서 나는 문 밖으로가는 중이 야. 나는 또한 대용량 데이터 세트의 종류에 아주 잘 수행 할 것이라고 상상할 수 없다. 내가 확인했던 것이 그 그래도 오류가없는 이상 실행에. :)

    이것은 단지 내 머리 위로 떨어져 있으며,이 검증되지 않은, 그래서 나는 문 밖으로가는 중이 야. 나는 또한 대용량 데이터 세트의 종류에 아주 잘 수행 할 것이라고 상상할 수 없다. 내가 확인했던 것이 그 그래도 오류가없는 이상 실행에. :)

    SELECT
         value_column1,
         (
         SELECT
              AVG(value_column1) AS moving_average
         FROM
              Table1 T2
         WHERE
              (
                   SELECT
                        COUNT(*)
                   FROM
                        Table1 T3
                   WHERE
                        date_column1 BETWEEN T2.date_column1 AND T1.date_column1
              ) BETWEEN 1 AND 20
         )
    FROM
         Table1 T1
    
  2. ==============================

    2.톰 H의 접근 방식은 작동합니다. 당신은 ID 열이있는 경우는 다음과 같이 그것을 단순화 할 수 있습니다 :

    톰 H의 접근 방식은 작동합니다. 당신은 ID 열이있는 경우는 다음과 같이 그것을 단순화 할 수 있습니다 :

    SELECT T1.id, T1.value_column1, avg(T2.value_column1)
    FROM table1 T1
    INNER JOIN table1 T2 ON T2.Id BETWEEN T1.Id-19 AND T1.Id
    
  3. ==============================

    3.나는 비슷한 문제가 있었다 때, 나는 여러 가지 이유로 임시 테이블을 사용하여 종료하지만이 훨씬 쉽게했다! 난 당신이 지금까지 스키마가 간다, 무슨 일을하는지 매우 유사 보이는 무슨 짓을.

    나는 비슷한 문제가 있었다 때, 나는 여러 가지 이유로 임시 테이블을 사용하여 종료하지만이 훨씬 쉽게했다! 난 당신이 지금까지 스키마가 간다, 무슨 일을하는지 매우 유사 보이는 무슨 짓을.

    ID 식별, 시작일, 종료일, 가치와 같은 스키마 뭔가를 확인합니다. 당신이 선택하면, 식별 ID를 기반으로 이전 (20)의 부속 평균을한다.

    만 이렇게 당신이 (가 작은 데이터 집합을 가지고 도움이되었다, 그래서 나는 반복해서 다른 메트릭에 대해 동일한 행을 히트)하지만 이미 다른 이유로 임시 테이블을 사용하여 자신을 발견합니다.

  4. ==============================

    4.내 솔루션은 테이블의 행 번호를 추가합니다. 다음 예제 코드 도움이 될 수 있습니다 :

    내 솔루션은 테이블의 행 번호를 추가합니다. 다음 예제 코드 도움이 될 수 있습니다 :

    set @MA_period=5;
    select id1,tmp1.date_time,tmp1.c,avg(tmp2.c) from 
    (select @b:=@b+1 as id1,date_time,c from websource.EURUSD,(select @b:=0) bb order by date_time asc) tmp1,
    (select @a:=@a+1 as id2,date_time,c from websource.EURUSD,(select @a:=0) aa order by date_time asc) tmp2
    where id1>@MA_period and id1>=id2 and id2>(id1-@MA_period)
    group by id1
    order by id1 asc,id2 asc
    
  5. ==============================

    5.나는이 대답은 너무 늦게 칠년에 대한 것을 알고 있습니다. 나는 비슷한 요구 사항을 가지고 그것이 다른 사람에게 유용 경우 내 솔루션을 공유하고자합니다.

    나는이 대답은 너무 늦게 칠년에 대한 것을 알고 있습니다. 나는 비슷한 요구 사항을 가지고 그것이 다른 사람에게 유용 경우 내 솔루션을 공유하고자합니다.

    이동 평균 간단한을 포함 기술적 분석에 대한 몇 가지 MySQL의 확장 기능이 있습니다. 그들은 정말 설치가 용이하고 사용 위치 : https://github.com/mysqludf/lib_mysqludf_ta#readme

    당신이 (추가 정보에 지침에 따라) UDF를 설치 한 후에는이 같은 select 문에서 이동 평균 간단한을 포함 할 수 있습니다 :

    SELECT TA_SMA(value_column1, 20) AS sma_20 FROM table1 ORDER BY datetime_column1 
    
  6. ==============================

    6.내 경험에 의하면, MySQL은 5.5.x의로, 의존 선택에 인덱스를 사용 하위 쿼리 여부에 참여하지 않는 경향이있다. 이 종속 선택 기준이 모든 행에 변경 성능에 매우 중요한 영향을 미칠 수 있습니다.

    내 경험에 의하면, MySQL은 5.5.x의로, 의존 선택에 인덱스를 사용 하위 쿼리 여부에 참여하지 않는 경향이있다. 이 종속 선택 기준이 모든 행에 변경 성능에 매우 중요한 영향을 미칠 수 있습니다.

    평균 이동하면이 범주에 해당하는 쿼리의 예입니다. 실행 시간은 행의 제곱으로 증가 할 수 있습니다. 이를 방지하려면 의존 선택에 인덱스 룩업을 수행 할 수있는 데이터베이스 엔진을 선택했다. 나는 포스트 그레스가이 문제에 대해 효과적으로 작동 찾을 수 있습니다.

  7. from https://stackoverflow.com/questions/878473/how-do-i-calculate-a-moving-average-using-mysql by cc-by-sa and MIT license