Oracle скользящий расчет LEAD - PullRequest
       6

Oracle скользящий расчет LEAD

0 голосов
/ 07 февраля 2019

Возможно ли в Oracle иметь расчет скользящего отведения?У меня есть таблица, где первая строка установлена ​​на 100%.Каждая строка после этого равна предыдущему проценту, умноженному на коэффициент, в этом примере o.99978.Я могу получить ответ только для первого ряда, не скатываясь до конца.seq 3 должен быть равен 0.99956 и т. д.

SELECT SEQ, 
(CASE WHEN SEQ = 1 THEN PERC LAG(PERC) OVER (ORDER BY SEQ) * FACTOR END) 
PERC
FROM 
(SELECT 1 SEQ, 0.99978 FACTOR, 1 PERC FROM DUAL UNION ALL
SELECT 2 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 3 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 4 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 5 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 6 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 7 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 8 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 9 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL UNION ALL
SELECT 10 SEQ, 0.99978 FACTOR, NULL PERC FROM DUAL);

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

В Oracle нет агрегатной / аналитической функции PRODUCT(), но вы можете получить тот же эффект (с несколькими ошибками округления), используя EXP(SUM(LN(value))), а для получения накопительного продукта вы можете использовать оконную аналитическую функцию SUM( value ) OVER ( ORDER BY ... [RANGE|ROWS] BETWEEN ... ).

Здесь показано, как выполнить расчет, когда значения не совпадают в каждой строке:

WITH test_data ( SEQ, FACTOR ) AS (
  SELECT  1, 0.99978 FROM DUAL UNION ALL
  SELECT  2, 0.99978 FROM DUAL UNION ALL
  SELECT  3, 0.99978 FROM DUAL UNION ALL
  SELECT  4, 0.99978 FROM DUAL UNION ALL
  SELECT  5, 0.99978 FROM DUAL UNION ALL
  SELECT  6, 0.99978 FROM DUAL UNION ALL
  SELECT  7, 0.99900 FROM DUAL UNION ALL
  SELECT  8, 0.99978 FROM DUAL UNION ALL
  SELECT  9, 0.99978 FROM DUAL UNION ALL
  SELECT 10, 0.99978 FROM DUAL
)
SELECT SEQ,
       FACTOR,
       EXP(
         COALESCE(
           SUM( LN( FACTOR ) ) OVER ( ORDER BY SEQ ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ),
           LN(1)
         )
       ) AS PERC
FROM   test_data;

Вывод :

SEQ | FACTOR |                                      PERC
--: | -----: | ----------------------------------------:
  1 | .99978 |                                         1
  2 | .99978 | .9997799999999999999999999999999999999907
  3 | .99978 | .9995600483999999999999999999999999999915
  4 | .99978 | .9993401451893519999999999999999999999783
  5 | .99978 | .9991202903574103425599999999999999999725
  6 | .99978 | .9989004838935317122846367999999999999711
  7 |   .999 | .9986807257870751353079341799039999999662
  8 | .99978 | .9976820450612880601726262457240959999696
  9 | .99978 | .9974625550113745767993882679500366988414
 10 | .99978 | .9972431132492720743924924025310876907504

дБ <> скрипка здесь

0 голосов
/ 07 февраля 2019

Просто сделайте это:

select seq, factor, power(factor,seq-1) as perc
from my_table

, где ваша таблица похожа на ту, что на картинке, только с первыми двумя столбцами

здесь пример на dbfiddle

...