表:Enrollments
+---------------+---------+
| Column Name | Type |
+---------------+---------+
| student_id | int |
| course_id | int |
| grade | int |
+---------------+---------+
(student_id, course_id) 是该表的主键。
编写一个 SQL 查询,查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 course_id 最小的一门。查询结果需按 student_id 增序进行排序。
查询结果格式如下所示:
Enrollments 表:
+------------+-------------------+
| 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 |
+------------+-----------+-------+
Result 表:
+------------+-------------------+
| student_id | course_id | grade |
+------------+-----------+-------+
| 1 | 2 | 99 |
| 2 | 2 | 95 |
| 3 | 3 | 82 |
+------------+-----------+-------+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/highest-grade-for-each-student
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
审题:查找成绩最高的一门课程。
思考:按照id和成绩排序,查找第一个。
查找最大成绩,然后查找,重复按照id排序。
解题:
第一步:获取每id最高成绩
select student_id,max(grade) from Enrollments group by student_id
第二步,(id,成绩)作为数组对应上述结果,可得对应的课程id
where (student_id,grade) in (第一步代码)
第三步,打平的情况,通过select min(course_id)解决即可。
select student_id,min(course_id) as course_id,grade
from Enrollments
where (student_id,grade) in
(select student_id,max(grade) from Enrollments group by student_id)
group by student_id, grade
方法二:
-- MySQL先使用子查询找到每个student_id对应的最好成绩,然后直接取MIN(course_id)去掉tied的情况
SELECT student_id, MIN(course_id) AS course_id, grade
FROM Enrollments
WHERE (student_id, grade) IN (SELECT student_id, MAX(grade)
FROM Enrollments
GROUP BY student_id)
GROUP BY student_id
ORDER BY student_id
知识点: