2012-09-06 16 views
3

不知道這是否可能通過標準查詢,但這裏是我希望我的數據是。可能的遞歸或分析查詢。這可以通過SQL完成還是需要腳本?

CORRECTION_FACT 

基本上,如果NEW SETTLE爲空或者這是第1行比修正係數總是1。如果行> 1比修正係數是PREV ROW STORED_SETTLE/NEW_SETTLE例如:

START END SETTLE NEW_SETTLE CORRECTION_FACT STORED_SETTLE 
1  2  120  NULL   1     120 
2  3  127  119   1.0084    128.0668 
3  4  NULL  125   1.0245344   NULL 

計算是如下完成的。一百十九分之一百二十零

STORED_SETTLE 

這將永遠是CORRECTION_FACTOR * SETTLE。直到插入下一行,纔會知道該值,因此會有時間爲NULL。棘手的部分是,這是依賴於CORRECTION_FACT這也是一個計算值和CORRECTION_FACT是依賴於STORED_SETTLE

就我的價值而言,我有SETTLE, NEW_SETTLE, STARTEND。將始終需要計算CORRECTION_FACTSTORED_SETTLE

所以這裏的問題是我可以用某種遞歸查詢或分析函數來做到這一點,還是我必須編寫一個腳本來填充?

回答

4
with T1 as 
    (select 1 strt, 2 en, 120 settle, null new_settle from dual union all 
    select 2 strt, 3 en, 127 settle, 119 new_settle from dual union all 
    select 3 strt, 4 en, null settle, 125 new_settle from dual 
) 
select strt 
    , en 
    , settle 
    , new_settle 
    , correction_fact 
    , stored_settle 
    from t1 
    model 
    dimension by(row_number() over (order by strt) RowNumber) 
    measures(strt, en, settle, new_settle 
      , cast(null as number) correction_fact 
      , cast(null as number) stored_settle) 
    rules automatic order 
    (
    correction_fact[1]=1, 
    correction_fact[RowNumber>1] = decode(new_settle[cv()], null, 
        1,stored_settle[cv()-1]/new_settle[cv()]),       
    stored_settle[rownumber]=(correction_fact[cv()]*settle[cv()]) 
    ); 

結果:

STRT   EN  SETTLE NEW_SETTLE CORRECTION_FACT STORED_SETTLE 
---------- ---------- ---------- ---------- --------------- ------------- 
    1   2  120       1   120 
    2   3  127  119  1.00840336 128.067227 
    3   4     125  1.02453782 
相關問題