暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

阿里云sql挑战赛第一题解题思路及答案

原创 寒冰 2023-06-17
599

数据准备

CREATE TABLE Student (
id INT PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE Test (
id INT PRIMARY KEY,
name VARCHAR(50)
);

CREATE TABLE TestAttempt (
id INT PRIMARY KEY,
studentId INT,
testId INT,
score INT,
FOREIGN KEY (studentId) REFERENCES Student(id),
FOREIGN KEY (testId) REFERENCES Test(id)
);







解题思路首先处理一个学生在同一场考试中有多条记录,通过testid,studentid选择最高分数。

select testid,max(score) as score,studentid from testattempt ta group by testid,studentid;

然后再使用窗口函数RANK()对每个考试的分数进行排序,并为每个考试的每个学生分配一个排名。然后,查询选择排名在前三名的学生,并按考试ID和分数降序排序结果。

 SELECT

testid,

StudentId,

Score,

RANK() OVER(PARTITION BY testid ORDER BY Score DESC) as Ranka

FROM        

testattemptm



完整代码:

with testattemptm

as (select testid,max(score) as score,studentid from testattempt ta group by testid,studentid),

RankedScores AS (

SELECT

testid,

StudentId,

Score,

RANK() OVER(PARTITION BY testid ORDER BY Score DESC) as Ranka

FROM

testattemptm

)

SELECT

testid,

StudentId, t.name,st.name,

Score

FROM

RankedScores rs

left join test t on rs.testid=t.id

left join student st on rs.studentid=st.id

WHERE

Ranka <= 3

ORDER BY

testid,

    Score DESC;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论