В 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
дБ <> скрипка здесь