根据前一行同一列的值计算值
Calculate value based on value from same column of the previous row
我有一个问题,我必须使用一个公式来计算列,该公式使用在前一行中完成的计算的值。
我试过滞后功能,但无法超过第二行。在那之后我所有的值都是空的,因为该列最初是空的。我觉得我错过了什么。
我需要计算一个新列,使用公式:
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
您可以使用递归 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
我有一个问题,我必须使用一个公式来计算列,该公式使用在前一行中完成的计算的值。
我试过滞后功能,但无法超过第二行。在那之后我所有的值都是空的,因为该列最初是空的。我觉得我错过了什么。
我需要计算一个新列,使用公式:
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
您可以使用递归 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