SQL: группировка по столбцу после сортировки - PullRequest
3 голосов
/ 26 февраля 2011

Учитывая структуру таблицы со столбцами name и rank, с возможностью дублирования для 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 голосов
/ 26 февраля 2011
select name, max(rank) as MaxRank
    from books
    group by name
1 голос
/ 26 февраля 2011

Обычно все, что вам нужно, это стандартная группа

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
1 голос
/ 26 февраля 2011
SELECT name 
     , MAX(rank) AS rank
  FROM books
 GROUP BY name

Это самый простой запрос для возврата набора результатов в вашем примере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...