减去同一列中的字段以获得间隔
问题描述:
我有一个表“@ table1”,我想递归地更新从“底部”的“金额”列到由RowID排序的顶部。即取负的值中减去该值与行的值以上时,如果最终的结果仍是负减去与下一行该值,以0减去同一列中的字段以获得间隔
DECLARE @table1 TABLE (RowID int, Amount int);
INSERT @table1 VALUES
(1,20),
(2,10),
(3,-10),
(4,10),
(5,-5),
(6,30);
Select * from @table1
RowID Amount
----------- -----------
1 20
2 10
3 -10
4 10
5 -5
6 30
结果表替换前一值
DECLARE @table1 TABLE (RowID int, Amount int);
INSERT @table1 VALUES
(1,20),
(2,0),
(3,0),
(4,5),
(5,0),
(6,30);
Select * from @table1
RowID Amount
----------- -----------
1 20
2 0
3 0
4 5
5 0
6 30
答
我能想到实现这个(作为单个查询)的唯一方法就是使用类似于running total的东西。这有效地结束了将产品表加入其自身的方式,即对于“左”表中的每一行,“右”表包含“先于它”的所有记录。这样,您可以保持更新字段的运行总数。不幸的是,编写和执行起来非常混乱。
根据您的预期使用场景,这可能是游标是更好的替代方案的罕见情况之一。使用游标和表变量写一个应该是相对平凡的。
单值110?为什么从50中减去50,忽略了0,并且12和34保持不变?负面价值观与什么有什么关系(我在这里没有看到任何负面价值)?这个问题不清楚,我想你已经遗漏了一些信息。 –
@AaronBertrand - 不确定为什么有人想要这样做,但要求似乎是这样的:从最后一条记录开始,为行减去110或ProductCount,以最大者为准(即)不要变为负值。更新要减去的数字,然后重复,直到没有剩余部分要减去。 –
@KipReal:问题不清楚。如果你想得到很好的答案,请添加补充信息。我没有投票。 –