SQL Server, как подсчитать накопительное УМНОЖЕНИЕ?

В 2012 сервере появился накопительный итог, и это было очень круто. А как насчёт накопительного произведения? С ходу два варианта:

  1. рекурсия - медленно
  2. CLR - отлично, сработает, но нет возможности...

Как без CLR можно организовать накопительное умножение?


Ответы (1 шт):

Автор решения: Majestio

Как без 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)) идея следующая - мы используем логарифм для преобразования умножения в сложение. Сначала мы берем логарифм каждого значения, затем суммируем их, и в конце применяем экспоненту, чтобы получить накопительное произведение. Ну не знаю, может быть поможет. Ещё раз подчеркну - проверять нужно, а не на чем. Это не готовый код, так - "заготовка".

→ Ссылка