Найти лучшего ученика по каждому предмету

Есть таблица с оценками учеников:

Grades

student_id - идентификатор ученика subject_id - идентификатор предмета grade - оценка ученика по предмету

Написать запрос, который для каждого предмета возвращает идентификатор лучшего ученика.

Данные таблицы

Лучшее до чего додумался - как найти топ оценку для каждого предмета, но как пририсовать туда имена студентов недопёр.

(SELECT subject_id , MAX( grade) FROM grades GROUP BY subject_id);

Финальный ответ должен выглядеть примерно так введите сюда описание изображения


Ответы (1 шт):

Автор решения: GlebV

Попробуйте с функцией RANK(), она всем ученикам с наивысшей оценкой по предмету даст ранг 1:

WITH cte AS ( 
    SELECT student_id, subject_id, grade, 
        RANK() OVER (PARTITION BY subject_id ORDER BY grade DESC) best
    FROM grades
)
SELECT *
FROM cte
WHERE best = 1;

PS Запрос не проверял, потому что в вопросе нет примера данных в текстовом виде.

→ Ссылка