表: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 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
法一:子查询
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
思路:
先找出每个学生的最大分数,再筛选最小课程Id
法二:窗口函数
select student_id,course_id,grade
from (select *,
row_number() over(partition by student_id order by grade desc,course_id) rk
from enrollments) t
where rk=1
思路:
根据学生序号分组,按照成绩由大到小,课程序号由小达到排序构建新的字段rk,然后选择rk=1,即对于不同学生,成绩最大,序号最小的一个,即为题目所求
注意:
窗口函数中order by 后可跟多个条件
|