首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么ORDER + MAX()在我分组时返回最大值?

为什么ORDER + MAX()在我分组时返回最大值?
EN

Stack Overflow用户
提问于 2011-04-28 15:03:33
回答 3查看 17.4K关注 0票数 2

我有一个查询的这一部分:

代码语言:javascript
复制
GROUP BY trackid 
ORDER BY MAX(history.date) DESC

我看到,当我分组时,它返回每个组的最大日期行。为什么会有这种行为?顺序应该在分组的整个rows...not上工作吗?!?

编辑(示例)

这是我的全部疑问:

代码语言:javascript
复制
SELECT tracklist.value, history.date
FROM history JOIN tracklist ON history.trackid=tracklist.trackid 
ORDER BY history.date DESC

结果是:

代码语言:javascript
复制
tracklist3  2011-04-27 15:40:36
tracklist2  2011-04-27 13:15:43
tracklist2  2011-04-02 00:30:02
tracklist2  2011-04-01 14:20:12
tracklist1  2011-03-02 14:13:58
tracklist1  2011-03-01 12:11:50

如您所见,所有行都由history.date正确排序。现在我想对它们进行分组,为每个组保留MAX history.date的行。因此,产出应该是:

代码语言:javascript
复制
tracklist3  2011-04-27 15:40:36
tracklist2  2011-04-27 13:15:43
tracklist1  2011-03-02 14:13:58

我看到:

代码语言:javascript
复制
GROUP BY trackid 
ORDER BY MAX(history.date) DESC

工作正常,但我真的不明白它为什么工作:) Order是针对整个行,而不是对分组.。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-04-28 15:06:57

当你说SELECT trackid, MAX(history.date) ... GROUP BY trackid ORDER BY MAX(history.date) DESC的时候,你真的是在说:“为每个履历显示给我最新的历史条目,请先给我看看它最近的历史条目是(总体上)最近的。”

ORDER BY是在分组之后应用的(这就是它在中的GROUP BY后面的原因)。

注意,在您的示例中,您使用的是SELECT tracklist.value, history.date而不是SELECT tracklist.value, MAX(history.date)。这是错误的,不幸的是,MySQL没有给出警告,但它随意选择了一个随机 history.date

票数 6
EN

Stack Overflow用户

发布于 2011-04-28 15:17:51

如果您只想对结果集排序,那么ORDER BY MAX(history.date) DESC就有点多余了。排序适用于结果集

如果删除ORDER子句,请考虑结果。否则,您的查询只会在trackid列上分组,因此它将无效--您需要向date列添加聚合函数,或者将date列添加到GROUP BY子句中。通过将聚合函数添加到ORDER子句中,您实际上是在告诉SQL引擎,对于每一组trackid,都要获得最大日期。这似乎是你想要的。

票数 4
EN

Stack Overflow用户

发布于 2011-04-28 15:58:34

你似乎没有完全理解这个小组的陈述。我建议你查一下它的教程。

但本质上,GROUP BY语句将多个行合并为一个行。按组分组的列名确定新的合并行的唯一性。SQL不知道如何处理所有非分组列,因为每个新的合并行都将从这些列中包含不同值的许多行中提取数据。这就是为什么在SELECT语句中的非分组列上使用聚合函数的原因。聚合函数MAX()查看history.date列中正在组合的行的所有值,并且只返回其中的一个。此外,ORDER子句只能使用正在选择的列,这就是ORDER还必须包含聚合函数的原因。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5820722

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档