赛题一:找出各项考试中的佼佼者
活动参与地址:https://developer.aliyun.com/mission/activity/sql
表: Student
Column Name |
Type |
id |
int |
name |
varchar |
Id是该表的主键列。
该表的每一行都表示学生的ID和姓名。
表: Test
Column Name |
Type |
id |
int |
name |
varchar |
Id是该表的主键列。
该表的每一行表示考试ID和考试名。
表: TestAttempt
Column Name |
Type |
id |
int |
studentId |
int |
testId |
int |
score |
int |
Id是该表的主键列。
studentId和testId分别是Student表和Test表中id的外键。
该表的每一行表示一次考试记录,并包含了学生和考试的id。
一个学生可以参加任意考试,不限次数。
现在我们关注的是每门考试有哪些顶尖的学生。一门考试的 顶尖学生 是指一个学生的分数在参加该考试的 不同 学生中 得分排名前三 。
编写一个SQL查询,找出每个考试中 得分最高的的考生 。
若同一个考生有多条考试记录,则取最高分。
如果存在并列,将并列的考生都列举出来,直到列举的考生达到或超过三人。
以 每门考试考试分数从高到低的顺序 返回结果表。
示例 :
输入:
Student 表:
id |
name |
1 |
Joe |
2 |
Henry |
3 |
Sam |
4 |
Max |
5 |
Janet |
6 |
Randy |
7 |
Will |
Test 表:
id |
name |
1 |
GRE |
2 |
TOEFL |
TestAttempt 表:
id |
studentId |
testId |
score |
1 |
1 |
1 |
330 |
2 |
3 |
1 |
319 |
3 |
5 |
2 |
108 |
4 |
5 |
2 |
112 |
5 |
1 |
2 |
98 |
6 |
7 |
1 |
300 |
7 |
6 |
2 |
100 |
8 |
4 |
1 |
300 |
输出:
Test |
Student |
Score |
GRE |
Joe |
330 |
GRE |
Sam |
319 |
GRE |
Max |
300 |
GRE |
Will |
300 |
TOEFL |
Henry |
112 |
TOEFL |
Randy |
100 |
TOEFL |
Joe |
98 |
解释:GRE考试,Joe和Sam的最好成绩分别排在前二,Max和Will并列第三。TOEFL中,Henry考取了112,108两个高分,但是只取最高的112分。Randy和Joe分别排在第二和第三。