一、题目
常见大数据面试SQL-查询每个学科第三名的学生的学科成绩总成绩及总排名
有学生成绩表,包含学生姓名、学科、成绩三个字段,请用一条SQL查询出每个学科排名第三名的学生,他的学科成绩、总成绩、以及总排名。
样例数据
+----------+----------+--------+
| student | subject | score |
+----------+----------+--------+
| 张三 | 语文 | 95 |
| 李四 | 语文 | 90 |
| 王五 | 语文 | 88 |
| 赵六 | 语文 | 77 |
| 张三 | 数学 | 80 |
| 李四 | 数学 | 90 |
| 王五 | 数学 | 92 |
| 赵六 | 数学 | 84 |
| 张三 | 英语 | 82 |
| 李四 | 英语 | 93 |
| 王五 | 英语 | 88 |
| 赵六 | 英语 | 68 |
+----------+----------+--------+
二、分析
本题要求查询排名第三的学生的成绩,考察的是排序函数,要查询总成绩,考察sum()over(partition by )开窗函数。总排名则是再一次的考察排序函数。
维度 | 评分 |
---|---|
题目难度 | ⭐️⭐️⭐️⭐️ |
题目清晰度 | ⭐️⭐️⭐️⭐️⭐️ |
业务常见度 | ⭐️⭐️⭐️⭐️ |
三、SQL
1.查询学科排名、每个学生总成绩
查看学科内排名,使用row_number函数,按照学科进行分组,分数倒叙排名。这里可以使用rank,dense_rank,题目并无特殊要求,这里使用row_number,如果有特殊要求可以根据不同要求使用,并无影响。
执行SQL
select student,
subject,
score,
row_number() over (partition by subject order by score desc) as subject_rn,
sum(score) over (partition by student) as total_score
from t_student_score_13
查询结果
+----------+----------+--------+-------------+--------------+
| student | subject | score | subject_rn | total_score |
+----------+----------+--------+-------------+--------------+
| 张三 | 语文