【问题标题】:Get the minimum non zero value across multiple columns获取跨多列的最小非零值
【发布时间】:2013-10-17 10:58:09
【问题描述】:

假设我有下表:

CREATE TABLE numbers
(
  key integer NOT NULL DEFAULT 0,
  number1 integer NOT NULL DEFAULT 0,
  number2 integer NOT NULL DEFAULT 0,
  number3 integer NOT NULL DEFAULT 0,
  number4 integer NOT NULL DEFAULT 0,

  CONSTRAINT pk PRIMARY KEY (key),
  CONSTRAINT nonzero CHECK (key <> 0)
)

我要检索的是所有 4 个数字的给定键中的最小值,但忽略那些为零的值。

当我认为我会遇到零问题时,我开始这样做:

SELECT LEAST(number1, number2, number3, number4) FROM numbers WHERE key = 1

例如,如果我有元组(1, 5, 0, 3, 2) 我想返回2,或者对于(2, 3, 0, 0, 0) 我想返回3 等等。

这可以在单个查询中完成(或者可能是嵌套的),我真的不想编写一个过程来做到这一点。

【问题讨论】:

  • 我不明白,你说你想要最小的非零值,但在你的 2 个例子中你似乎与此相矛盾。
  • @Eluvatar:在他的例子中,第一个数字是key

标签: sql postgresql greatest-n-per-group


【解决方案1】:

试试NULLIF函数:

SELECT LEAST(
        nullif( number1, 0 ), 
        nullif( number2, 0 ), 
        nullif( number3, 0 ), 
        nullif( number4, 0 )) 
FROM numbers

演示 --> http://www.sqlfiddle.com/#!12/641fb3/1

【讨论】:

    【解决方案2】:

    LEAST 将忽略 NULL 值,因此以下应该可以工作:

    select least(n1, n2, n3, n4)
    from (
       select case when number1 <= 0 then null else number1 end as n1,
              case when number2 <= 0 then null else number2 end as n2,
              ...
        from numbers
    ) t
    

    这样你也可以处理负数。如果您确定永远不会有负值,kordirko 的答案可能会更容易一些。

    【讨论】:

    • 是的,谢谢,在现实生活中他们是约会对象,所以没有负值
    • @BrunoJ:我很困惑,0 是一个无效的日期值。
    • 它们实际上是日期,具有日期类型,我们使用“0100-01-01”作为“零”日期
    猜你喜欢
    • 2021-12-27
    • 1970-01-01
    • 2018-05-22
    • 2022-06-16
    • 2014-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多