SQL 滚动 12 个月递减

Rolling 12 Months Decrements in SQL

我有这样的数据

YearMonth   Recovery   Segment
 201701      0.002       NULL
   .           .          .
   .           .          .
 201712      0.002       NULL
 201801      0.002       NULL
   .           .          .
   .           .          .
 201812      0.002       NULL

同样,我有 10 年的数据,我想使用 Recovery 列(在 10 年内不同)填充 Segment Column。对于第一年 201701-201712,分段是 0.002 然后对于下一年 201801-201812 它是 0.002*(1 - 0.2) = 0.0004 然后对于 201901-201912 它是 0.0004*(1-0.2) 等等。

我正在尝试使用连接逻辑,但一年后无法继续。任何帮助将非常感激。提前谢谢你。

新数据看起来像这样

YearMonth   Recovery   Segment
 201701      0.002       0.002
   .           .          .
   .           .          .
 201712      0.002       0.002
 201801      0.002       0.0004
   .           .          .
   .           .          .
 201812      0.002       0.0004
DECLARE @Source TABLE
(
    YearMonth INT,
    Recovery DECIMAL(20, 10),
    Segment DECIMAL(20, 10)
);

WITH months
AS (SELECT TOP (10 * 12)
           ROW_NUMBER() OVER (ORDER BY t1.object_id) AS MonthNo
    FROM sys.all_columns t1
        INNER JOIN sys.all_columns t2
            ON t1.object_id = t2.object_id),
     dates (d)
AS (SELECT DATEADD(MONTH, MonthNo - 1, '20170101')
    FROM months)
INSERT INTO @Source
(
    YearMonth,
    [Recovery]
)
SELECT YEAR(d) * 100 + MONTH(d),
       0.002
FROM dates;


UPDATE @Source
SET Segment = [Recovery] * POWER(1 - 0.20000, YearMonth / 100 - 2017);

SELECT *
FROM @Source;

我会把它当作一道算术题来处理:

select t.*,
       recovery * power(1 - 0.2, convert(int, left(yearmonth, 4)) - 2017) as segment
from t;

0.2 减少 20%。

如果您确实要设置值:

update t
    set segment = recovery * power(1 - 0.2, convert(int, left(yearmonth, 4)) - 2017);