Рассчитать значение на основе значения из того же столбца предыдущей строки - PullRequest
0 голосов
/ 07 февраля 2019

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

Я пробовал функцию задержки, но не могу пройти второй ряд.После этого все мои значения равны нулю, так как этот столбец изначально начинается с нуля.Я чувствую, что что-то упустил.

Мне нужно вычислить новый столбец по формуле:

MovingRate = MonthlyRate + (0.7 * MovingRatePrevious)

... где MovingRatePrevious - это MovingRate предыдущего ряда.Для месяца 1 у меня есть значение, поэтому мне не нужно пересчитывать его, но мне нужно это значение, чтобы можно было рассчитать последующие строки.Мне нужно разделить по типу.

Это мой исходный набор данных:

Month   Type    MonthyRate  MovingRate
--------------------------------------
1       Blue    0.400       0.330
2       Blue    0.300   
3       Blue    0.700   
4       Blue    0.900   

Желаемые результаты в столбце MovingRate:

Month   Type    MonthyRate  MovingRate
---------------------------------------
1       Blue    0.400       0.330
2       Blue    0.300       0.531
3       Blue    0.700       1.072
4       Blue    0.900       1.650

1 Ответ

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

Вы можете рассчитать его с помощью рекурсивного CTE.Ниже приведена обобщенная версия для ваших данных:

DECLARE @t TABLE (Month INT, Type VARCHAR(100), MonthlyRate DECIMAL(18, 3));
INSERT INTO @t VALUES
(1, 'Blue', 0.400),
(2, 'Blue', 0.300),
(3, 'Blue', 0.700),
(4, 'Blue', 0.900);

WITH cte1 AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Month) AS rn
    FROM @t
), rcte AS (
    SELECT *, CAST(0.330 AS DECIMAL(18, 3)) AS MovingRate
    FROM cte1 AS base
    WHERE rn = 1
    UNION ALL
    SELECT curr.*, CAST(curr.MonthlyRate + 0.7 * prev.MovingRate AS DECIMAL(18, 3))
    FROM cte1 AS curr
    JOIN rcte AS prev ON curr.Type = prev.type AND curr.rn = prev.rn + 1
)
SELECT *
FROM rcte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...