GROUP BY - 排序分组前后

时间:2012-01-04 22:46:14

标签: mysql sql greatest-n-per-group

我的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的HAVING子句(modified_time),但它也没有返回正确的结果。也许我只需要与知识渊博的人讨论这个问题,但如果这个问题有足够的意义,你可以告诉我需要什么,那么也许有一个简单的答案。

奖励问题:
是否可以在没有子查询的情况下执行此操作?

2 个答案:

答案 0 :(得分:1)

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

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

...或者像蒂姆这样的解决方案与使用像ROW_NUMBER

这样的分析函数相关联

答案 1 :(得分: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