3

これが可能かどうかは定かではありませんが、標準のクエリを使用することはできませんが、データをどのようにしたいかを次に示します。

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

計算は次のように行われます。

CORRECTION_FACT

基本的に、NEW SETTLE が null の場合、またはこれが行 1 の場合、補正係数は常に 1 です。行 > 1 の場合、補正係数はPREV ROW STORED_SETTLE / NEW_SETTLE 例です。120/119

STORED_SETTLE

これは常にCORRECTION_FACTOR*になりますSETTLE。この値は、次の行が挿入されるまでわからないため、NULL になる場合があります。トリッキーな部分は、これCORRECTION_FACTも計算された値であり、CORRECTION_FACT依存しているに依存していることSTORED_SETTLEです。

私が持っている価値観に関して言えば、私はSETTLE, NEW_SETTLE, STARTとを持っていENDます。 常に計算する必要がありますCORRECTION_FACTSTORED_SETTLE

ここでの質問は、ある種の再帰クエリまたは分析関数を使用してこれを行うことができるか、それとも入力するスクリプトを作成する必要があるかということです。

4

1 に答える 1

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
于 2012-09-06T18:59:13.300 に答える