运行 两列之间的差异
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 个表表示 个无序 个集合。除非列指定该信息,否则没有排序。
当 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 个表表示 个无序 个集合。除非列指定该信息,否则没有排序。