我有一个有两列的临时表

create table temp
(
    id int identity(1,1),
    amount decimal(18,2)
)

样本数据插入如下

insert into temp(credit) 
values (100), (200), (500)

这张桌子看起来像

id amount
-----------
1  100
2  200
3  500

我试图实现的是,如果我们从表中扣除150,那么扣除应该按照Id的顺序进行.这意味着Id 1的金额将为0(100-150=0,剩余为50),然后Id 2的金额将为150(之前扣除的余额50必须从200减少)

所以结果数据集应该是

id amount
---------
1  0
2  150
3  500

推荐答案

窗口所有以前记录的累积总和,保存到cte以进行别名:

create table #a(id int,amount int)

insert #a values(1,100),(2,200),(3,500)

select * from #a

declare @sub int=150
;with cte as
(
    select id,amount,isnull(sum(amount) over (order by id rows between unbounded preceding and 1 preceding),0) as prev_sum
    from #a
)
select *,case
            when @sub-prev_sum>amount then 0
            when @sub-prev_sum>0 then amount-(@sub-prev_sum)
            else amount
         end
from cte

Sql相关问答推荐

获取每个帖子的匹配关键字列表

使用Mac日志(log)时间找出SQL中的好小时和坏小时

如何从多行数据中获取一行合并数据?

计算分段的总权重

部分匹配表中元素的MariaDB查询查找结果

使用Kotlin Exposed SQL DSL Select 多个值并排序

用于过滤嵌套对象或数组中的JSON数据的WHERE条件

直接加法(1+1)与聚合函数SUM(1+1)的区别是什么

SQL Athena/prest判断值是否在嵌套的json数组中

如何在AWS Athena中 Select JSON数组的最后一个元素?

使用多个WITH子查询的替代方法

获取分布在同一行的列中的出现次数

根据具有特定值的 ID 创建自定义组

JSON_VALUE 不适用于提取的 json 中的嵌套路径

使用临时表判断记录是否存在 - 如果存在则执行相同的操作

如何在sparksql查询中使用日期值?

在没有订单的情况下,如何生成一个值为0的顾客天数行

在Snowflake中如何使用SQL对版本字符串进行排序?

奇怪的甲骨文行为

如何在 SQLite 中将列的两个或多个相等的连续值合并为一个?