【问题标题】:Rolling 12 Months Decrements in SQL在 SQL 中滚动 12 个月递减
【发布时间】:2019-01-24 12:34:08
【问题描述】:

我有类似这样的数据

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

同样,我有 10 年的数据,我想使用 Recovery 列填充 Segment Column(整个 10 年不同)。对于第一年 201701-201712,Segment 是 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

【问题讨论】:

  • 0.002*(1-0.2) = 0.0004 怎么来的?你的意思是每年乘以0.2吗? 0.002*0.2 = 0.0004,不是吗?
  • 对不起,这只是一个计算错误,应该是 0.0016。实际上,我希望每年减少 20% 的恢复。

标签: sql tsql rollup


【解决方案1】:

我会将此视为算术问题:

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);

【讨论】:

  • 谢谢,这正是我要找的
【解决方案2】:
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;

【讨论】:

    猜你喜欢
    • 2013-10-06
    • 1970-01-01
    • 2020-08-29
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    相关资源
    最近更新 更多