题目:
表: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]
标签:grade,力扣,course,1112,student,MySQL,Enrollments,id From: https://www.cnblogs.com/liu-myu/p/17308717.html