3 votes

Requête récursive ou analytique possible. Cela peut-il être fait via SQL ou un script est-il nécessaire ?

Je ne sais pas si cela est possible ou non par le biais d'une requête standard, mais voici comment je voudrais que mes données soient.

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

Les calculs sont effectués comme suit :

CORRECTION_FACT

En fait, si NEW SETTLE est nul ou s'il s'agit de la rangée 1, le facteur de correction est toujours égal à 1. Si la rangée > 1, le facteur de correction est égal à PREV ROW STORED_SETTLE / NEW_SETTLE eg. 120/119

STORED_SETTLE

Ce sera toujours CORRECTION_FACTOR * SETTLE . Cette valeur n'est pas connue avant l'insertion de la ligne suivante, il y aura donc des moments où elle sera NULL. La partie délicate est que cela dépend de CORRECTION_FACT qui est également une valeur calculée et CORRECTION_FACT dépend de STORED_SETTLE .

En ce qui concerne les valeurs que j'ai, j'ai SETTLE, NEW_SETTLE, START y END . CORRECTION_FACT y STORED_SETTLE devra toujours être calculée.

La question est donc de savoir si je peux le faire avec une sorte de requête récursive ou de fonction analytique ou si je dois écrire un script pour le remplir.

4voto

Nicholas Krasnov Points 15938
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()])
   );

Résultat :

  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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X