sql - 使用减法 SQL 运行总计
问题描述
我有以下示例数据集
ID | 日期 | 平衡 |
---|---|---|
116210 | 2021 年 4 月 16 日 | 570,788 |
116210 | 2021 年 4 月 17 日 | 57,152 |
116210 | 2021 年 4 月 18 日 | 57,152,106 |
116210 | 2021 年 4 月 19 日 | 5,549,211 |
116210 | 2021 年 4 月 20 日 | 5,748,370 |
116210 | 2021 年 4 月 21 日 | 5,425,046 |
我想要做的是监控余额的日常变动如下
ID | 日期 | 平衡 | 移动 |
---|---|---|---|
116210 | 2021 年 4 月 16 日 | 570,788 | 0 |
116210 | 2021 年 4 月 17 日 | 57,152 | (513,636) |
116210 | 2021 年 4 月 18 日 | 57,152,106 | 57,094,954 |
116210 | 2021 年 4 月 19 日 | 5,549,211 | (51,602,895) |
116210 | 2021 年 4 月 20 日 | 5,748,370 | 199,159 |
116210 | 2021 年 4 月 21 日 | 5,425,046 | (323,324) |
我写了以下脚本
SELECT id,
[date],
balance,
balance-SUM([balance]) OVER (PARTITION BY [id] ORDER BY [id],[date])
AS movement
FROM [corporate].[dbo].[balances_apr]
但是,它是添加余额而不是减去
解决方案
您可以使用 LAG 函数并从 Balance 中减去,如下所示:
DECLARE @test table(ID int, vDATE date, BALANCE int)
insert into @test values
(116210 ,'4/16/2021', 570788 )
,(116210 ,'4/17/2021', 57152 )
,(116210 ,'4/18/2021', 57152106 )
,(116210 ,'4/19/2021', 5549211 )
,(116210 ,'4/20/2021', 5748370 )
,(116210 ,'4/21/2021', 5425046 );
SELECT ID, VdATE, Balance, iif(balance = movement, 0, movement) as movement FROM
(
SELECT ID,VDate, Balance, balance - LAG(Balance,1,0) over (partition by id order by vDate) as movement FROM @test
) AS T
ID | 日期 | 平衡 | 移动 |
---|---|---|---|
116210 | 2021-04-16 | 570788 | 0 |
116210 | 2021-04-17 | 57152 | -513636 |
116210 | 2021-04-18 | 57152106 | 57094954 |
116210 | 2021-04-19 | 5549211 | -51602895 |
116210 | 2021-04-20 | 5748370 | 199159 |
116210 | 2021-04-21 | 5425046 | -323324 |
推荐阅读
- confluent-platform - 删除数据库中的某些内容时删除 ksqlDB 表中的某些内容
- javascript - ReactMarkdown 未在 React 应用程序中显示
- r - 在 R 中遇到 tximport 问题
- api - 列出组织的所有 GitHub 企业存储库
- java - 同一事务中mybatis删除表中所有数据后,实体仍然可以被选中
- python - 错误:无法从版本中找到满足 Django==1.10.5 要求的版本:无错误:找不到匹配的发行版 Django==1.10.5
- three.js - 不透明度为 0 的 Three.js 对象仍会遮挡其他点材质,如何避免这种干扰?
- javascript - 在 D3.js v6 中为日期字段自动调整轴刻度增量以避免重叠的最佳方法是什么?
- c++ - 如何实现这种类型的数据结构?
- c++ - 如何在 C++ 中添加异步等待?