运行 两列之间的差异

Running Difference between two columns

当 saldo 1 低于 saldo 2 时,我想计算 运行-差异。

你可以在下面找到我的数据集

我希望获得如下结果

我已经尝试了很多子查询和不同的方法来寻找差异。我发现许多 运行-totals 具有一个值的例子等等。但是我无法让我的条件语句起作用,如果我只是在没有条件语句的情况下编写干净的代码,我的值总是错误的。

这是我目前的代码。我正在使用分区,因为我想在 ID 更改时重置。

IF SALDO1 < SALDO2
BEGIN
SELECT ID, SALDO1, SALDO2, 
    SUM(SALDO2 - SALDO1) over (PARTITION BY ID ORDER BY ID) as RunningDifference
END

ELSE 
BEGIN 
   '0'  
END

FROM test2;

谢谢!

您似乎想要 window 总和周围和内部的条件语句:

select id, saldo1, saldo2, 
    case when saldo1 < saldo2   
        then sum(case when saldo1 < saldo2 then saldo2 - saldo1 else 0 end) 
            over (partition by id order by ordering_id) 
        else 0
    end as runningdifference
from test2

如果你的数据库支持greatest(),我们可以缩短内部表达式:

select id, saldo1, saldo2, 
    case when saldo1 < saldo2   
        then sum(greatest(saldo2 - saldo1, 0)) over (partition by id order by ordering_id) 
        else 0
    end as runningdifference
from test2

请注意,您的 over() 子句不稳定:partition by id order by id 未提供分区内行的一致排序标准:所有行都是并列的,因此所有行最终都加在一起。你需要一个确定性的排序标准来达到你想要的结果,我假设 ordering_id.

您似乎知道 saldo2 大于 saldo 时的 运行 差异。那将是

select t.*,
       (case when saldo2 > saldo1
             then sum(case when saldo2 > saldo1 then saldo2 - saldo1 else 0 end) over (partition by id order by <ordering column>)
             else 0
        end)
from test2 t;

请注意,您的问题预设了一个表示排序的列。那应该是 order by 的参数,而不是 id(用于分区)。 SQL 个表表示 个无序 个集合。除非列指定该信息,否则没有排序。