Было бы яснее использовать временные таблицы для хранения результатов по пути и обеспечения возможности отслеживания результата, но решение может быть достигнуто с помощью одного запроса:
WITH student_marks AS (
SELECT Class_num, Name, SUM(Marks) AS student_total_marks
FROM School
GROUP BY Class_num, Name
)
SELECT Class_num, Name, student_total_marks
FROM (
SELECT Class_num, Name, student_total_marks, ROW_NUMBER() OVER(partition by Class_num order by student_total_marks desc, Class_num) AS beststudentfirst
FROM student_marks
) A
WHERE A.beststudentfirst = 1
Запрос в операторе WITH вычисляет сумма баллов за каждого ученика в классе. На этом этапе subject больше не требуется. Результат временно сохраняется в student_marks .
. Далее нам нужно создать счетчик (beststudentfirst), используя ROW_NUMBER для нумерации итоговых оценок от самых высоких до самых низких в каждом классе (упорядочить по student_total_marks des c, Class_num). Счетчик следует перезапускать каждый раз при изменении класса (разделение по порядку Class_num).
Из этого последнего результата нам нужен только счетчик (beststudentfirst) со значением один. Это лучший ученик в каждом классе.