Умножить на предыдущее значение в Oracle SQL

Его легко умножить (или суммировать / разделить / и т. Д.) С предыдущей строкой в ​​электронной таблице Excel, однако я не смог сделать это до сих пор в Oracle SQL.

A          B    C
199901   3.81   51905
199902  -6.09   48743.9855
199903   4.75   51059.32481
199904   6.39   54322.01567
199905  -2.35   53045.4483
199906   2.65   54451.15268
199907   1.1    55050.11536
199908  -1.45   54251.88869
199909   0      54251.88869
199910   4.37   56622.69622

Above, column B is static and column C has the formula as:
    ((B2/100)+1)*C1
    ((B3/100)+1)*C2
    ((B4/100)+1)*C3

Пример: 51905 из строки 1, умноженное на -6.09 из строки 2: ((-6.09 / 100) +1) * 51905

Я пробовал аналитические и оконные функции, но пока не удалось. Функция LAG может дать предыдущее значение строки в текущей строке, но не может дать вычисленное предыдущее значение.

1 ответ

Решение

Это можно сделать с помощью предложения MODEL

select * 
FROM (
     SELECT t.*,
       row_number() over (order by a) as rn
     from table1 t
)
MODEL
  DIMENSION BY (rn)
  MEASURES ( A, B,  0 c )
  RULES (
      c[rn=1] = 51905, -- value in a first row
      c[rn>1] = round( c[cv()-1] * (b[cv()]/100 +1), 6 )   
  )
  ;

Демо: http://sqlfiddle.com/

| RN |      A |     B |            C |
|----|--------|-------|--------------|
|  1 | 199901 |  3.81 |        51905 |
|  2 | 199902 | -6.09 |   48743.9855 |
|  3 | 199903 |  4.75 | 51059.324811 |
|  4 | 199904 |  6.39 | 54322.015666 |
|  5 | 199905 | -2.35 | 53045.448298 |
|  6 | 199906 |  2.65 | 54451.152678 |
|  7 | 199907 |   1.1 | 55050.115357 |
|  8 | 199908 | -1.45 | 54251.888684 |
|  9 | 199909 |     0 | 54251.888684 |
| 10 | 199910 |  4.37 | 56622.696219 |
Другие вопросы по тегам