SQL:排序后按列分组

4

假设有一个带有namerank列的表结构,可能存在name的重复项,如何才能按name去重并取得最大的rank

例如,假设有以下数据:

+-------+-------+
| name  | rank  |
+-------+-------+
| a     | 1     |
| a     | 2     |
| b     | 10    |
| b     | 20    |
| c     | 100   |
| c     | 200   |
+-------+-------+

查询应该返回以下结果:
+-------+-------+
| a     | 2     |
| b     | 20    |
| c     | 200   |
+-------+-------+

我有一个解决方案,但速度非常慢,我怀疑它的时间复杂度是O(N^2)。
SELECT name, 
       rank 
FROM   books temp1 
WHERE  rank = (SELECT max(rank) 
                      FROM   book temp2 
                      WHERE  temp1.name = temp2.name) 

这个能不能改进?有没有更好的方法来实现这个功能?

我正在使用MySQL,但最终需要转换为JPA,如果有JPA/Hibernate的惯用语言也将不胜感激。

3个回答

5
select name, max(rank) as MaxRank
    from books
    group by name

1
SELECT name 
     , MAX(rank) AS rank
  FROM books
 GROUP BY name

这是在你的示例中返回结果集的最简单的查询。


1
你在 name 后面多了一个逗号。 - vlad

1

通常你只需要一个标准的分组

SELECT name, 
       max(rank) as rank
FROM   books temp1
GROUP BY name

但由于它是MySQL,也有另一种选择

SELECT name, 
       rank
FROM   (
    SELECT name, rank
    FROM books
    ORDER BY name, rank desc) ordered
GROUP BY name

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接