首页 > 解决方案 > 当数字为负时,累积计算未正确完成

问题描述

我有下表:

最终日期 final_precise_date local_limit_amount 限制金额
2020 年 12 月 10 日 2020-12-10 18:45:10.590 1000000.000000 4800000.00
2020 年 12 月 10 日 2020-12-10 18:45:37.650 800000.000000 4800000.00
2020 年 12 月 18 日 2020-12-18 19:01:09.530 1425000.000000 4800000.00
2020 年 12 月 31 日 2020-12-31 00:00:00.000 -1425000.000000 4800000.00
2021 年 1 月 18 日 2021-01-18 00:00:00.000 500000.000000 4800000.00
2021 年 4 月 27 日 2021-04-27 00:00:00.000 -800000.000000 4800000.00
2021 年 7 月 22 日 2021-07-22 00:00:00.000 -1000000.000000 4800000.00
2021 年 12 月 31 日 2021-12-31 00:00:00.000 -500000.000000 4800000.00

local_limit_amount 应该从一行到另一行累积增加或减少。

我编写了以下代码以累积获取数据:

SELECT
    final_date            AS 'value_date'
    , final_precise_date  AS 'precise_value_date'
    , limit_amount
    , limit_amount_ccy_id
    , (
        LAG(local_limit_amount, 1, 0) OVER (ORDER BY final_precise_date) 
        + LAG(local_limit_amount, 2, 0) OVER (ORDER BY final_precise_date) 
        + local_limit_amount
      )                   AS 'local_limit_amount'
    , future_exposure     AS 'initial_exposure'
    , future_availability AS 'initial_availability'
FROM
    #temp3
ORDER BY
    final_precise_date ASC

然而,计算只对前 3 行是正确的,因为要增加的数量是正数,从第四行开始,所有的累积都变得错误,因为数量应该是 1800000 而我只看到 800000

价值日期 精确值日期 限制金额 limit_amount_ccy_id local_limit_amount
2020 年 12 月 10 日 2020-12-10 18:45:10.590 4800000.00 22 1000000.000000
2020 年 12 月 10 日 2020-12-10 18:45:37.650 4800000.00 22 1800000.000000
2020 年 12 月 18 日 2020-12-18 19:01:09.530 4800000.00 22 3225000.000000
2020 年 12 月 31 日 2020-12-31 00:00:00.000 4800000.00 22 800000.000000
2021 年 1 月 18 日 2021-01-18 00:00:00.000 4800000.00 22 500000.000000
2021 年 4 月 27 日 2021-04-27 00:00:00.000 4800000.00 22 -1725000.000000
2021 年 7 月 22 日 2021-07-22 00:00:00.000 4800000.00 22 -1300000.000000
2021 年 12 月 31 日 2021-12-31 00:00:00.000 4800000.00 22 -2300000.000000

标签: sql

解决方案


如果我正确地跟随了你,你需要sumamalytical 功能。

代替

(
 LAG(local_limit_amount, 1, 0) OVER (ORDER BY final_precise_date) 
 + LAG(local_limit_amount, 2, 0) OVER (ORDER BY final_precise_date) 
 + local_limit_amount
)                  

Sum(local_limit_amount) OVER (ORDER BY final_precise_date)

推荐阅读