我有下表
文字 | 数字1 | 数字2 | 数字3 |
---|---|---|---|
测试1 | 1 | 2 | 3 |
测试2 | 4 | 2 | 1 |
测试3 | 7 | 1 | 8 |
我需要得到 2 个差异
我只关心第一个差异是否为负,第二个差异是否为正。
所以我做了以下事情
MINVALUE(Num1 - Num2, 0)
MAXVALUE(Num1 - Num3, 0)
此外,我想要一个差值为 1 或 2 的字段,以不为 0 为准。
文字 | 数字1 | 数字2 | 数字3 | MINVALUE(Num1 - Num2, 0) | MAXVALUE(Num1 - Num3, 0) | 差异 |
---|---|---|---|---|---|---|
测试1 | 1 | 2 | 3 | -1 | 0 | -1 |
测试2 | 4 | 2 | 1 | 0 | 3 | 3 |
测试3 | 7 | 1 | 8 | 0 | 0 | 0 |
我似乎找不到一种简短的方法来找到
DIFF
列并最终得到重复的代码,目前我正在使用
case MINVALUE(Num1 - Num2, 0)
when 0 then maxvalue(num1 - num3, 0)
else MINVALUE(Num1 - Num2, 0)
end
有没有办法减少这种情况?
这里有一个dbfiddle:https://dbfiddle.uk/2OpPzJYU
注:
实际计算比
NUM1 - NUM2
更复杂。
包括字符串操作、日期差异、日期添加、案例等,我担心由于重复的代码,它的性能会比只计算一次更差。
我找不到 Firebird 是否会优化重复代码的答案,所以如果它只计算
case
和 else
块一次而不是两次,我会对手头的解决方案感到满意。
最后我有三种状态,负值,正值和0,它应该更喜欢负值或正值而不是0。
您可以使用派生表:
select
difference1,
difference2,
case
when difference1 = 0 then difference2
else difference1
end as difference3
from (
select
minvalue(num1 - num2, 0) as difference1,
maxvalue(num1 - num3, 0) as difference2
from SourceData
) t
dbfiddle:https://dbfiddle.uk/2KaFKMLg