表: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 |
--建表语句
Create table If Not Exists Enrollments (student_id int, course_id int, grade int);
Truncate table Enrollments;
insert into Enrollments (student_id, course_id, grade) values ('2', '2', '95');
insert into Enrollments (student_id, course_id, grade) values ('2', '3', '95');
insert into Enrollments (student_id, course_id, grade) values ('1', '1', '90');
insert into Enrollments (student_id, course_id, grade) values ('1', '2', '99');
insert into Enrollments (student_id, course_id, grade) values ('3', '1', '80');
insert into Enrollments (student_id, course_id, grade) values ('3', '2', '75');
insert into Enrollments (student_id, course_id, grade) values ('3', '3', '82');
--答案1 窗口函数
with tmp as
(
select
*,
row_number() over(partition by student_id order by grade desc,course_id) as rn
from
Enrollments
)
select
student_id,
course_id,
grade
from
tmp where
rn=1