sql - 根据前一行值更新 Closing_Balance
问题描述
我有一个包含 ID、Opening_Balance 和 Closing Balance 列的表,如下所示。这是我们的客户维护的现有表,OB 引用了需要添加/减去前一行 cb 的金额。例如,如果我从供应商那里收到 100 rs,那么我需要添加 100 作为 ob 和 600 作为 cb。
ID OB CB
===============
1 100 100
2 100 200
3 100 300
4 100 400
5 -100 300
6 100 400
7 100 500
8 -100 400
如果我更新/删除中间的某些行,则期末余额应根据前一行值进行更新。
例如,我要为 ID = 4 更新 OB = 200,所以输出应该如下:
ID OB CB
===============
1 100 100
2 100 200
3 100 300
4 200 500
5 -100 400
6 100 500
7 100 600
8 -100 500
我尝试了以下 sql 尝试,但它不能单次运行
UPDATE A
SET OB = 200, CB = OB + PrevCB
FROM A JOIN (SELECT LAG(CB) OVER (ORDER BY ID)PrevCB, ID FROM A) X ON A.ID = X.ID
WHERE A.ID = 4;
UPDATE A
SET CB = OB + PrevCB
FROM A JOIN (SELECT LAG(CB) OVER (ORDER BY ID)PrevCB, ID FROM A) X ON A.ID = X.ID
WHERE A.ID > 4;
解决方案
您可以尝试使用SUM
窗口功能。
UPDATE T
SET OB = 200
FROM T
WHERE ID = 4;
UPDATE T
SET CB = val + (SELECT CB FROM T WHERE ID = 3)
FROM T JOIN (
SELECT SUM(OB) over(order by ID) val, ID
FROM T
WHERE ID > 3
) X ON T.ID = X.ID
结果
ID OB CB
===============
1 100 100
2 100 200
3 100 300
4 200 500
5 -100 400
6 100 500
7 100 600
8 -100 500
推荐阅读
- firebase - firebase cli:数据库规则 - 如何指定要应用的数据库
- php - 尝试使用 preg_match 检查请求的页面中是否存在特定单词
- spring-boot - spring-boot中的异常处理
- c - OpenGL C++ 在图像上创建一个滤镜镜头
- ios - 如果我必须输入 24.00,UIDatePicker.time 问题
- react-native - 捆绑失败:错误:无法从 `index.js` 解析模块`@babel/runtime/helpers/interopRequireDefault`:
- html - 使用 display:flex 的 div 容器只能在 index.html 中正常工作
- pandas - 如果列表中的子字符串出现在字符串中,则为新列赋值
- c# - 剃刀组件中的“typeparam”语法错误 - blazor
- javascript - 调用 Nuxt JS 静态文件