【问题标题】:MAX function without group by没有分组依据的 MAX 函数
【发布时间】:2012-06-19 20:39:05
【问题描述】:

我有下表:

ID | NUM
 1 |  4
 2 |  9
 3 |  1
 4 |  7
 5 |  10

我想要一个结果:

ID | NUM
 5 | 10

当我尝试使用 MAX(NUM) 时,我得到一个错误,我必须使用 GROUP BY 才能使用 MAX 函数

有什么想法吗?

【问题讨论】:

  • 你想要最多什么? IDNUM?
  • 我想要Num的MAX,但我也想知道ID。
  • 如果您砍掉 5、10 并获得 2、9 作为预期结果,示例可能会更好。另外,如果两行共享一个 MAX(num) 怎么办?

标签: sql sql-server


【解决方案1】:

怎么样:

SELECT TOP 1 ID,NUM FROM table ORDER BY NUM DESC;

【讨论】:

    【解决方案2】:

    这样做 -

    SELECT TOP 1 ID,
           NUM
    FROM <yourtable>
    ORDER BY NUM DESC;
    

    【讨论】:

    • @AaronBertrand - 我希望你知道提问者可以编辑他的问题。为什么你认为LIMIT 有 3 个答案?
    • 抱歉,我在 5 小时后来到这里,没有看到任何对问题进行任何编辑的证据。显然,如果我看到 LIMIT 个答案,我不应该让他们留下来,因为他们不正确,对吧?感谢您的更正,但现在只是重复了。
    【解决方案3】:

    可能返回超过 1 个结果:

    SELECT id, num
      FROM table
      WHERE num = (SELECT MAX(num) FROM table)
    

    【讨论】:

      【解决方案4】:

      根据错误,如果选择列表中有任何非聚合列,则使用 Max 之类的聚合需要 Group By 子句(在您的情况下,您试图找到 MAX(Num) 然后返回在ID 列中关联的值)。在 MS SQL Server 中,您可以通过排序和限制返回的行来获得所需的内容:

      SELECT TOP 1 ID, NUM 
      FROM [table] 
      ORDER BY NUM DESC;
      

      在其他 RDBMS 系统中,LIMIT 提供类似的功能。

      编辑

      如果您需要返回所有具有相同最大值的行,请使用WITH TIES qualification

      SELECT TOP 1 WITH TIES ID, NUM 
      FROM [table] 
      ORDER BY NUM DESC;
      

      【讨论】:

      • MySQL(没有TOP)会是什么样子?
      • 我的问题更多是关于问题的第二部分,我想获取所有具有最大值的行
      • WITH TIES 似乎不是 ANSI SQL 的一部分。常见的解决方法似乎是自加入最高值,然后限制结果:stackoverflow.com/q/3469107
      【解决方案5】:

      试试这个查询。

          WITH result AS 
          (
            select DENSE_RANK() OVER(  ORDER BY NUM desc) AS RowNo,ID,NUM from #emp 
           )
          select ID,NUM from result where RowNo=1
      

      即使它有更多的 MAX 值,它也会返回最大值,例如:

      ID | NUM
       5 | 10
       6 | 10 
      

      请参阅以下链接以了解有关排名功能的更多信息:
      http://msdn.microsoft.com/en-us/library/ms189798

      【讨论】:

        【解决方案6】:

        获取所有行都有最大值但有 3 个选择,这对性能不利

        SELECT id, MAX(num) as num
        FROM table
        GROUP BY id
        ORDER BY MAX(num) DESC
        LIMIT (SELECT COUNT(*) 
               FROM table 
               WHERE num =(SELECT MAX(num) FROM table)
               )
        

        【讨论】:

        • 这个问题被标记为SQL Server,没有LIMIT
        猜你喜欢
        • 2022-11-02
        • 1970-01-01
        • 2011-09-12
        • 1970-01-01
        • 2021-12-02
        • 1970-01-01
        • 2022-12-13
        • 2021-01-27
        • 2016-01-28
        相关资源
        最近更新 更多