【问题标题】:SQL finding minimum that is non-zeroSQL 查找非零的最小值
【发布时间】:2021-02-18 19:34:40
【问题描述】:

我无法找到非零的最小值。

例如,我有一张表格,显示每个人赚的钱,其中一些人一无所获。我想排除那些没有任何收入的人,并找到收入最低的人的名字(即非零)。

我试过了:

SELECT name, earnings
FROM paylist
WHERE earnings = (SELECT min(earnings)
            FROM paylist) AND EXISTS (SELECT * 
                                         FROM paylist
                                         WHERE earning <> 0)

但我意识到 min(earnings) 将变为 0 并且在输出中不返回任何值。 我应该如何编写查询?

另外,有人告诉我可能有两种写法: 1. 使用聚合函数(例如 COUNT、SUM、MAX、MIN) 2.不使用任何聚合函数 有什么区别?

【问题讨论】:

标签: python mysql sql


【解决方案1】:

使用子查询中的条件省略收入为零的行,找到最低收入并在外面使用。

select name,
    earnings
from paylist
where earnings = (
        select min(earnings)
        from paylist
        where earnings <> 0
        )

或者使用nullif,它可以利用 min 返回最小非空值这一事实:

select name,
    earnings
from paylist
where earnings = (
        select min(nullif(earnings,0))
        from paylist
        )

不同的是第一个可以使用索引,如果有的话。以上两个将返回所有具有最低非零收益的行

如果你只想要一行最少非零收入,你可以使用limit(不需要聚合):

select *
from paylist
where earnings <> 0
order by earnings
limit 1

【讨论】:

    【解决方案2】:

    假设有一个表 T00188SK,它共有 6 列(id、C0、C1、C2、C3、C4),其中 id 是 AUTO_INCREMENT PRIMARY KEY 列。如果你想从 (C0, C1, C2, C3, C4) 中找出除零以外的最小值

    MySQL 有一个巧妙的方法来做到这一点。去吧:

    SELECT LEAST(MIN(NULLIF(C0, 0)), MIN(NULLIF(C1, 0)), MIN(NULLIF(C2, 0)), MIN(NULLIF(C3, 0)), MIN (NULLIF(C4, 0))) AS finalmin FROM T00188SK

    #SQL #MySQL #数据库

    【讨论】:

      猜你喜欢
      • 2022-06-16
      • 2014-10-26
      • 2019-02-09
      • 2021-04-04
      • 2015-11-25
      • 2012-06-29
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多