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