2014-03-24 3 views
1
이 LAG 계산을 완료하는 방법

어떻게 내가하고 싶은 것은 (달 (사용 N-1 값을 새로운 월과 가치의 조합을 얻을 수있다오라클

Month    Value  Market 
2010/01   100   1 
2010/02   200   1 
2010/03   300   1 
2010/04   400   1 
2010/05   500   1 
2010/01   100   2 
2010/02   200   2 
2010/03   300   2 
2010/04   400   2 
2010/05   500   2 

같은 테이블의 달 및 값 열이) + 월 (n)의 가치)/2 = 월 n의 가치, 또한이 계산은 시장 칼럼을 기반으로합니다. 위의 예에서 새로운 월 및 값 조합은

Month    Value   Market 
2010/01   null    1 
2010/02   (100+200)/2  1 
2010/03   (200+300)/2  1 
2010/04   (300+400)/2  1 
2010/05   (400+500)/2  1 
2010/01   null    2 
2010/02   (100+200)/2  2 
2010/03   (200+300)/2  2 
2010/04   (300+400)/2  2 
2010/05   (400+500)/2  2 

이어야합니다. 오라클에서 달성하는 방법을 알고 계십니까? 고맙습니다! 데이터의 틈이 없을 경우

답변

5

, 당신은 LAG를 사용할 수 있습니다 격차가있는 경우

SQL> WITH DATA AS (
    2  SELECT DATE '2010-01-01' mon, 100 val FROM dual UNION ALL 
    3  SELECT DATE '2010-02-01' mon, 200 val FROM dual UNION ALL 
    4  SELECT DATE '2010-03-01' mon, 300 val FROM dual UNION ALL 
    5  SELECT DATE '2010-04-01' mon, 400 val FROM dual UNION ALL 
    6  SELECT DATE '2010-05-01' mon, 500 val FROM dual 
    7 ) 
    8 SELECT mon, (LAG(val) OVER (ORDER BY mon) + val)/2 avg_val FROM DATA; 

MON   AVG_VAL 
----------- ---------- 
01/01/2010 
01/02/2010   150 
01/03/2010   250 
01/04/2010   350 
01/05/2010   450 

그러나, 결과가 예상대로되지 않을 수도 있습니다. 이 경우, 당신도-자체 조인을 사용하거나 윈도우 절 좁힐 수 있습니다 :

SQL> WITH DATA AS (
    2  SELECT DATE '2010-01-01' mon, 100 val FROM dual UNION ALL 
    3  SELECT DATE '2010-02-01' mon, 200 val FROM dual UNION ALL 
    4  SELECT DATE '2010-03-01' mon, 300 val FROM dual UNION ALL 
    5  /* gap ! */ 
    6  SELECT DATE '2010-05-01' mon, 400 val FROM dual UNION ALL 
    7  SELECT DATE '2010-06-01' mon, 500 val FROM dual 
    8 ) 
    9 SELECT mon, (first_value(val) 
10     OVER (ORDER BY mon 
11      RANGE BETWEEN INTERVAL '1' MONTH PRECEDING 
12         AND INTERVAL '1' MONTH PRECEDING) 
13    + val)/2 avg_val 
14 FROM DATA; 

MON   AVG_VAL 
----------- ---------- 
01/01/2010 
01/02/2010   150 
01/03/2010   250 
01/05/2010 
01/06/2010   450 
+0

빈센트. 좋은 답변 주셔서 감사합니다. 내 질문을 편집하면 다른 조건을 추가하면이 계산이 시장 번호를 기반으로 어떻게 재 계산됩니까? 감사! –

+0

partition 절을 사용하십시오. [분석 함수] (http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174)를 참조하십시오. 예 :'LAG (val) OVER (시장 별 시장 주문 별)'. –

+0

감사합니다. 빈센트 –

3

이 그것을 수행합니다

SQL> select month, 
    2   (value+lag(value) over (order by month))/2 as value 
    3* from t1 

MONTH   VALUE 
---------- ---------- 
2010/01 
2010/02   150 
2010/03   250 
2010/04   350 
2010/05   450 

5 rows selected. 
+0

하이 토니. 귀하의 답변에 감사드립니다. 나는 내 질문을 편집,이 계산은 시장을 기반으로, 어떻게 해결할 수 있는지 알고 있니? 감사! –

+0

'over()'절을'over (월별 시장 주문 별 파티션) '로 변경하십시오. –

+0

답장을 보내 주셔서 감사합니다! –