2014-03-24 59 views
1

我有一個表月份和值列,像如何完成這個LAG計算在甲骨文

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-1 )+月份(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 

您知道如何在Oracle中實現它嗎?謝謝!

回答

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

使用分區子句,請參閱[分析函數](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

感謝您的回答! –