SQL Server, как подсчитать накопительное УМНОЖЕНИЕ?
В 2012 сервере появился накопительный итог, и это было очень круто. А как насчёт накопительного произведения? С ходу два варианта:
- рекурсия - медленно
- CLR - отлично, сработает, но нет возможности...
Как без CLR можно организовать накопительное умножение?
Ответы (1 шт):
Как без CLR можно организовать накопительное умножение?
Без какого-либо предметного примера сложно что-то советовать. Но попробую навскидку (без теста), авось пойдет идея:
WITH CumulativeProduct AS (
SELECT
Value,
EXP(SUM(LOG(Value)) OVER (ORDER BY Id
ROWS UNBOUNDED PRECEDING)) AS CumulativeProduct
FROM
(VALUES
(1, 1.05),
(2, 1.15),
(3, 1.07)
)V(Id, Value)
)
SELECT * FROM CumulativeProduct;
В строчке EXP(SUM(LOG(Value)) OVER (ORDER BY Id)) идея следующая - мы используем логарифм для преобразования умножения в сложение. Сначала мы берем логарифм каждого значения, затем суммируем их, и в конце применяем экспоненту, чтобы получить накопительное произведение. Ну не знаю, может быть поможет. Ещё раз подчеркну - проверять нужно, а не на чем. Это не готовый код, так - "заготовка".