2014-03-04 6 views
3

약 10 년 동안의 데이터가 포함 된 테이블 (날짜, 페이로드)이 있으며 14 일 (2 주) 및 90 일 기준으로 페이로드의 추세를 표시하기 위해 이동 평균 (MA) 일 (12 주) 간격오라클 이동 평균

내가이 쿼리 작성했습니다

하지만 나에게 잘못 값

SELECT x.*, 
    ABS (LTMA-STMA) DIFFERECNE 
FROM 
    (SELECT SDATE, 
    PAYLOAD, 
    AVG(PAYLOAD) OVER (ORDER BY W ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) STMA, 
    AVG(PAYLOAD) OVER (ORDER BY W ROWS BETWEEN 12 PRECEDING AND CURRENT ROW) LTMA 
    FROM 
(SELECT b.*, 
    TO_NUMBER(TO_CHAR(X.SDATE, 'W')) W 
FROM 
    (SELECT TO_DATE(TO_CHAR(a.SDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') SDATE, 
    SUM(a.PAYLOAD) PAYLOAD 
    FROM TABLE_PAYLOAD a 
    WHERE a.SDATE > sysdate - 3 * 365  
    GROUP BY TO_CHAR(a.SDATE, 'YYYY-MM-DD') 
    ORDER BY TO_CHAR(a.SDATE, 'YYYY-MM-DD') 
) b ) 
ORDER BY SDATE 
) x; 

을 얻는다는 사실은 내가 MA이 무엇인지 알고 있지만, 오라클이 어떻게 작동하는지 이해가 안 돼요!

Excel에서 MA을 계산할 수 있지만 데이터베이스 수준에서이 작업을 수행해야합니다. 수행 방법을 알려주십시오.

+0

최종 결과를 Windowing 절 (열 W)에서 사용 된 것과 동일한 키로 정렬하면 결과가 더 명확 해집니다. –

+0

'W'주의 숫자가 올바르지 않다고 생각합니다. W는 매월 1 일 (1 ~ 5)에 주 1이 해당 달의 첫 번째 날에 시작하여 일곱 번째 날에 끝나는 곳을 나타냅니다. – Noel

답변

3

TO_CHAR(SDATE, 'W')을 사용하는 요지는 무엇입니까?

SELECT x.*, ABS (LTMA-STMA) DIFFERENCE 
FROM 
(
    SELECT SDATE, PAYLOAD, 
     AVG(PAYLOAD) OVER (ORDER BY SDATE rows BETWEEN 14 PRECEDING AND CURRENT ROW) STMA, 
     AVG(PAYLOAD) OVER (ORDER BY SDATE rows BETWEEN 90 PRECEDING AND CURRENT ROW) LTMA 
    FROM 
    (
    SELECT a.SDATE, SUM(a.PAYLOAD) PAYLOAD 
    FROM TABLE_PAYLOAD a 
    WHERE a.SDATE > sysdate - 3 * 365  
    GROUP BY a.SDATE 
) 
) x 
ORDER BY SDATE; 

PS : 다음 문서에 따르면이 여전히 필요에 맞게 희망,

어쨌든 내가 쿼리를 단순화하기 위해 시도 ... 달에 당신에게 주 번호를 부여하도록되어 내가 돈 ' 이 중 하나를 수행 할 때 TO_DATE(TO_CHAR(a.SDATE, 'YYYY-MM-DD'), 'YYYY-MM-DD') 일 때이 값은 a.SDATE ...

+0

ORA-00907 : 오른쪽 괄호가 누락되었습니다. 00907. 00000 - "오른쪽 괄호가 누락되었습니다."* 원인 : * 행에서 오류 : 5 열 : 44 *** – Areff

+0

오, sory, 'ORDER BY'를 내 내부 쿼리에서 ... 쿼리를 변경했습니다. 다시 시도해 주시겠습니까? – Emmanuel

+3

'to_char (a.sdate, ...)'는 날짜에 저장된 시간 부분을 제거해야합니다. 'trunc (a.sdate) '를 사용하면 같은 일이 일어나고, 이것이 더 분명해질 것이라고 생각합니다. –