2017-05-30 93 views
1

我使用的是Oracle 12.1.0.2.0 我想要當前組(分區)的平均值差異 - 前一組(分區)的平均值 我的代碼獲取當前組平均是Oracle獲取當前和以前組(分區)的平均值

with rws as (
    select rownum x, mod(rownum, 2) y from dual connect by level <= 10 
), avgs as (
    select x, y, avg(x) over (partition by y) mean from rws 
) 
    select x, y, mean 
    from avgs; 

現在我想是這樣的:

 
X Y MEAN PREV_MEAN MEAN_DIFF 
4 0 6       
8 0 6       
2 0 6       
6 0 6       
10 0 6       
9 1 5  6   -1   
7 1 5       
3 1 5       
1 1 5       
5 1 5     
2 2 3  5   -3 
3 2 3     
5 2 3     
1 2 3     
4 2 3     
  1. AVG(這個分區組) - AVG(以前的分區組) 在這種情況下,我需要(5-6)在GROUP_MEAN_DIFFERENCE列中進行計算。

  2. 另外我怎樣才能得到平均差異總是w.r.t第一組。 在上面的例子中,我需要(5 - 6)和(3 - 6)

能否請您協助?

+1

什麼是 「以前的分區組」?請提供樣本數據和期望的結果。 –

+0

。 。您的示例數據不會使用代碼段中的列。目前還不清楚你的代碼和數據之間的關係是什麼。 –

回答

0

使用功能lag()ignore nulls條款:

select id, val, av, av - lag(av ignore nulls) over (order by id) diff 
    from (select id, val, 
       case when row_number() over (partition by id order by null) = 1 
        then avg(val) over (partition by id) end av 

      from t) 
    order by id 

測試:

with t (id, val) as (select 1, 44.520 from dual union all 
        select 1, 47.760 from dual union all 
        select 1, 50.107 from dual union all 
        select 1, 48.353 from dual union all 
        select 1, 47.640 from dual union all 
        select 2, 48.353 from dual union all 
        select 2, 50.447 from dual union all 
        select 2, 51.967 from dual union all 
        select 2, 45.800 from dual union all 
        select 2, 46.913 from dual) 
select id, val, av, av - lag(av ignore nulls) over (order by id) diff 
    from (select id, val, 
       case when row_number() over (partition by id order by null) = 1 
        then avg(val) over (partition by id) end av 

      from t) 
    order by id 

輸出:

ID VAL  AV  DIFF 
--- ------- ------- ------- 
1  44.520 47.676 
1  47.760 
1  50.107   
1  48.353   
1  47.640  
2  48.353 48.696  1.02 
2  50.447   
2  51.967   
2  45.800  
2  46.913 
+0

我們可以在沒有內部查詢的情況下實現嗎? – Vinaya

+0

我懷疑。如果我們嘗試在'avg()'上使用'lag()',我們得到'ORA-30483:窗口函數不允許在這裏。您可以將內部查詢移至CTE('with')部分。 –

+0

它與CTE(with)合作。謝謝你的幫助。 – Vinaya