力扣1112(MySQL)-每位学生的最高成绩(中等)

发布时间 2023-04-12 09:41:08作者: 我不想一直当菜鸟

题目:

表:Enrollments

(student_id, course_id) 是该表的主键。

问题
编写一个 SQL 查询,查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 course_id 最小的一门。查询结果需按 student_id 增序进行排序。

示例
Enrollments 表:

Result 表:

 建表语句:

1 Create table If Not Exists Enrollments_1112 (student_id int, course_id int, grade int);
2 Truncate table Enrollments_1112;
3 insert into Enrollments_1112 (student_id, course_id, grade) values ('2', '2', '95'),('2', '3', '95'),('1', '1', '90'),('1', '2', '99'),('3', '1', '80'),('3', '2', '75'),('3', '3', '82');

解题思路:

“”查询每位学生获得的最高成绩和它所对应的科目,若科目成绩并列,取 course_id 最小的一门”:

①以student_id进行分组,按照grade进行降序排列,如果grade相同再加上字段course_id升序排列,增加字段排序数rnk;

1 select *,row_number() over(partition by student_id order by grade desc,course_id) as rnk
2 from Enrollments_1112;

②最终取rnk = 1的数据即可。

1 select student_id,course_id,grade
2 from (
3     select *,row_number() over(partition by student_id order by grade desc,course_id) as rnk
4     from Enrollments_1112
5 ) as temp
6 where rnk = 1;

小知识:

又忘记排序的区别了,再写一次

①rank():相同的数据排序数相同,下一个不同就跳跃排序,例如:[1,2,2,4]

②dese_rank():相同的数据排序相同,下一个不同的也连续排序,例如:[1,2,2,3]

③row_number():相同的数据连续排序,例如:[1, 2, 3, 4]