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);
我有这样的数据
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);