选择一个非零值减少重复

问题描述 投票:0回答:1

我有下表

文字 数字1 数字2 数字3
测试1 1 2 3
测试2 4 2 1
测试3 7 1 8

我需要得到 2 个差异

  • Num1 和 Num2
  • Num1 和 Num3

我只关心第一个差异是否为负,第二个差异是否为正。

所以我做了以下事情

  • 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。

sql firebird
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.