1112. Highest Grade For Each Student

Level: Medium; Coursera

Question:

Table: Enrollments

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| student_id    | int     |
| course_id     | int     |
| grade         | int     |
+---------------+---------+
(student_id, course_id) is the primary key of this table.

Write a SQL query to find the highest grade with its corresponding course for each student. In case of a tie, you should find the course with the smallest course_id.

Return the result table ordered by student_id in ascending order.

The query result format is in the following example.

Example 1:

Input: 
Enrollments table:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 2          | 2         | 95    |
| 2          | 3         | 95    |
| 1          | 1         | 90    |
| 1          | 2         | 99    |
| 3          | 1         | 80    |
| 3          | 2         | 75    |
| 3          | 3         | 82    |
+------------+-----------+-------+
Output:
 
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 1          | 2         | 99    |
| 2          | 2         | 95    |
| 3          | 3         | 82    |
+------------+-----------+-------+

My Solution:

First step: choose the max grade for each student_id using group_by

Second step: choose from the (student_id, grade) tuple that is in the first step, find the min course_id in case of a tie, still use group_by

select student_id, min(course_id) as course_id, grade
from Enrollments
where (student_id, grade) in (
    select student_id, max(grade) as grade
    from Enrollments
    group by student_id)
group by student_id
order by student_id asc

Last updated