没有分组依据的 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 函数
有什么想法吗?
【问题讨论】:
你想要最多什么?ID
或 NUM
?
我想要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 函数的主要内容,如果未能解决你的问题,请参考以下文章