【问题标题】:How do I find the largest value in a column in postgres sql?如何在 postgresql 的列中找到最大值?
【发布时间】:2011-06-22 02:23:57
【问题描述】:

例如:

name | weight
jon    100    
jane   120    
joe    130

如何只返回体重最大的人的姓名?

【问题讨论】:

    标签: sql postgresql max


    【解决方案1】:

    如果您需要查找多行,例如每个人达到最大体重的日期:

    name | weight | day
    don    110      1
    don    120      20
    don    110      30
    joe    90       1
    joe    80       15
    joe    85       30
    

    即对于“don”,你想得到"don | 120 | 20",对于joe,你想要"joe | 90 | 1",那么你可以写:

    SELECT name, max(weight), (array_agg(day ORDER BY weight DESC))[1] FROM tbl GROUP BY name
    

    【讨论】:

    • 这是最优雅的解决方案!
    【解决方案2】:

    ORDER BY DESC 将具有空值的行放在顶部。

    为了避免返回对应于空值的结果:

    SELECT name FROM tbl WHERE weight = (SELECT MAX(weight) FROM tbl);

    注意:如果多人的体重等于最大体重,则此查询将返回多个结果。要仅获取一个,请将LIMIT 1 添加到查询的末尾。


    致谢和更多信息:

    Why do NULL values come first when ordering DESC in a PostgreSQL query?

    MIN/MAX vs ORDER BY and LIMIT

    Postgres MAX Function

    【讨论】:

      【解决方案3】:
      SELECT name FROM tbl ORDER BY weight DESC LIMIT 1
      

      比其他答案的性能要好得多,并且只产生一行。

      【讨论】:

      • 好答案。我还想指出,如果权重有索引,排序将在索引上执行,并且会更快。
      • 不错的答案,但是如果两个人的体重相同,它不会返回两个结果。
      • LIMIT 1 需要全表扫描。这是 not 性能很多行。尝试在您的查询上运行 EXPLAIN
      • 如果权重有NULL,则返回NULL
      • 可以使用 WHERE:SELECT name FROM tbl WHERE weight IS NOT NULL ORDER BY weight DESC LIMIT 1 过滤掉具有 NULL 值的权重。
      【解决方案4】:

      使用这个:

      select name
      from tbl
      where weight = (select max(weight) from tbl)
      

      【讨论】:

      • 哇,没想到使用嵌套查询真是太愚蠢了!谢谢!
      • 根据“weight”值等于最大值的行数,这可能会返回多个名称。仅供参考。
      • 你如何让它只返回具有最大值的行之一(不管它如何选择)?
      • select top 1 name from tbl where weight = (select max(weight) from tbl)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      • 2013-10-31
      相关资源
      最近更新 更多