GROUP BY - 排序前后分组

Posted

技术标签:

【中文标题】GROUP BY - 排序前后分组【英文标题】:GROUP BY - sorting pre and post grouping 【发布时间】:2012-01-04 22:46:14 【问题描述】:

我的 GROUP BY 查询有问题(至少对我来说是最棘手的)。

我想要做的是检索按另一列分组的最近修改的记录。我看到的问题是分组返回它找到(在组中)的唯一第一条记录,而不考虑 ORDER BY(返回最终结果时除外)。

这是我的代码的简化版本。

SELECT events.id, events.name, events.type, events.modified_time
FROM events
GROUP BY events.type
ORDER BY event.modified_time DESC

哪个会返回:

1 | Event One   | Birthday   | Jan 1, 2012  
2 | Event Two   | Graduation | Jan 1, 2012

实际上有第三条记录的修改时间更晚:

3 | Event Three | Birthday   | Jan 2, 2012

我尝试使用 MAX(modified_time) 的 HAVING 子句,但它也没有返回正确的结果。也许我只需要与知识渊博的人进行更多讨论,但如果这个问题足够有意义并且你能说出我需要什么,那么也许会有一个简单的答案。

额外问题: 没有子查询是否可以做到这一点?

【问题讨论】:

你不能在 GROUP BY 子句中添加events.modified_time 吗? @Lieven 那么当我真的想要最新的 2 条记录时,我会得到 3 条记录。 ORDER BY 不会影响 GROUP BY,如果你愿意的话,只会影响最终排序。 ***.com/questions/tagged/greatest-n-per-group+mysql 请注意,这仅“有效”,因为它是 MySQL - 这不会在大多数 RDBMS 上运行。具体来说,要么需要向GROUP BY 添加更多列,要么需要应用聚合函数(SUM()MAX() 等)。 MySQL 为您 (sorta) random 为其他未正确处理的列提供值(这是 stupid - 您得到的可能是 invalid 结果,它甚至没有告诉你)。 【参考方案1】:

在许多其他方法中,这可能对您有用:

SELECT a.id, a.name, a.[type], a.modified_time
FROM [events] AS a
    JOIN (
        SELECT MAX([events].id) AS id, [events].[type]
        FROM [events]
        GROUP BY [events].[type]    
    ) AS b ON a.id = b.id AND a.[type] = b.[type]
ORDER BY a.modified_time DESC

【讨论】:

您假设较大的 id 始终对应于较晚的 modified_time。 大声笑......我拥有的链接解决方案也显示了另一种方式。我猜我们会看看 OP 想要什么! @TimLehner 由于 OP 是按 type 分组并要求最近的 modified_time 的记录,因此它是有效的。 @Michael Mior 我仍然会说这两个假设都是潜在的陷阱,只有拥有数据的人才能评估。 @kurosch 感谢您先发制人地指出我想要的东西。另外,是的,id 是 key,modified_time 可以稍后更改。【参考方案2】:

GROUP BY/HAVING 不是你想要的。你想要的是:

WHERE
    events.modified_time = ( select max(modified_time) from events e2 where e2.type = events.type )

...或者像 Tim 这样的解决方案链接到使用像 ROW_NUMBER 这样的分析函数

【讨论】:

请注意,如果您有多个相同类型的事件具有相同的 modified_time,则这样的条件将返回所有事件。 AFAIK,MySQL 没有类似 SQL Server 的 ROW_NUMBER 的概念。 请注意,ROW_NUMBER 在 MySQL 中不存在。 @Lieven:只是一个小问题:它不是“SQL Server 的”row_number()。这称为窗口函数(标准 ANSI SQL),Oracle 和其他人自古就有它——而且功能也更强大。 @a_horse_with_no_name - 我知道,但提到的链接是关于 SQL Server 的,因此我参考了它。

以上是关于GROUP BY - 排序前后分组的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL05_ORDR BY排序LIMIT分组GROUP BY分组

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?

MySQL进阶5--分组排序和分组查询 group by(having) /order by

solr group分组排序的问题

sql group 后按分组数量的多少排序怎么写?

SQL语句中,如果有group by 和order by两个语句,是先分组还是先排序?