2012-01-04 2 views
3

У меня есть следующая таблица:найти запись с максимальным значением в SQL

Class, Name, Score 
1, Anna, 34 
1, Andy, 80 
2, Brooke, 90 
2, Brad, 70 
3, Charles, 67 
3, Christina, 66 

Как я найти «Имя» с максимумом «Score» в каждом «классе»?

Обязательный выход:

Class, Name, Score 
1, Andy, 80 
2, Brooke, 90 
3, Charles, 67 

Это для MySQL.

+2

Похоже, домашние задания. Подсказка: использование группы по и max – Steven

+0

Я добавил тег 'наибольшая-n-на-группу', этот вопрос очень популярен в StackOverflow. Следуйте этой ссылке для многих решений. –

+0

Что такое СУБД? –

ответ

4
WITH ClassScores AS 
(
    SELECT 1 AS class, 'Anna' AS name, 34 AS score 
    UNION 
    SELECT 1, 'Andy', 80 
    UNION 
    SELECT 2, 'Brooke', 90 
    UNION 
    SELECT 2, 'Brad', 70 
    UNION 
    SELECT 3, 'Charles', 67 
    UNION 
    SELECT 3, 'Christina', 66 
) 

SELECT C1.Class, C1.Name, C1.Score 
    FROM ClassScores AS C1 
    JOIN (SELECT Class, MAX(Score) AS MaxScore 
      FROM ClassScores 
     GROUP BY Class 
     ) AS C2 
    ON C1.Class = C2.Class 
    AND C1.Score = C2.MaxScore 
ORDER BY C1.Class; 
+1

+1 - работает. Добавлен CTE на случай, если кто-то захочет его протестировать –

+0

Спасибо, @AbeMiessler. Я отмечаю, что если два (или более) человека набрали одинаковый максимальный балл в классе, то вы получите несколько строк для этого класса - по одному для каждого из людей, которые набрали максимум. Вероятно, это лучше, чем случайным образом выбирать, кто выбран в качестве архетипа для определенного класса, - или вам нужны дополнительные критерии, чтобы отличать предполагаемых валидцев. –

+0

Спасибо за добавление CTE, что делает эти ответы гораздо более ценными. – Steven

0

Используйте UNION, а затем вы можете использовать три отдельных предложения отдельно. Он очистит код красиво.

Try ..

select class, name, max(score) as "Score" from yourTable where class=1 
UNION 
select class, name, max(score) as "Score" from yourTable where class=2 
UNION 
select class,name,max(score) as "Score" from yourTable where class=3 
+1

У меня 1000 таких «классов», и этот подход был бы трудноразрешимым для моего дела. – ElKamina

+0

haha ​​ok, я дал вам ответ, основанный на небольших данных, которые были даны. – MorganP

1

Другой способ - если ClassScores имеет (скрытые) PRIMARY KEY:

SELECT 
    cs.Class 
    , cs.Name 
    , cs.Score 
FROM 
     (SELECT DISTINCT Class 
     FROM ClassScores 
    ) AS csd 
    JOIN 
     ClassScores AS cs 
    ON cs.PK = 
     (SELECT csm.PK 
     FROM ClassScores csm 
     WHERE csm.Class = csd.Class 
     ORDER BY csm.Score DESC 
     LIMIT 1 
     ) 
Смежные вопросы