没有分组依据的 MAX 函数

Posted

技术标签:

【中文标题】没有分组依据的 MAX 函数【英文标题】:MAX function without group by 【发布时间】: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) 怎么办? 【参考方案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 的一部分。常见的解决方法似乎是自加入最高值,然后限制结果:***.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

以上是关于没有分组依据的 MAX 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有分组依据的情况下选择具有最大技能属性的 ID

Spark SQL 中分组依据和窗口函数如何交互?

具有分组依据的 PostgreSQL 聚合函数

Windows 函数和分组依据

r 将函数应用于.SDcols和分组依据

JPA NamedQuery 与聚合函数和分组依据一起使用