SQL面试题练习 —— 查询每个学科第三名的学生的学科成绩总成绩及总排名

目录

  • [1 题目](#1 题目)
  • [2 建表语句](#2 建表语句)
  • [3 题解](#3 题解)

1 题目

有学生成绩表,包含学生姓名、学科、成绩三个字段,请用一条SQL查询出每个学科排名第三名的学生,他的学科成绩、总成绩、以及总排名。

样例数据

复制代码
+----------+----------+--------+
| student  | subject  | score  |
+----------+----------+--------+
| 张三       | 语文       | 95     |
| 李四       | 语文       | 90     |
| 王五       | 语文       | 88     |
| 赵六       | 语文       | 77     |
| 张三       | 数学       | 80     |
| 李四       | 数学       | 90     |
| 王五       | 数学       | 92     |
| 赵六       | 数学       | 84     |
| 张三       | 英语       | 82     |
| 李四       | 英语       | 93     |
| 王五       | 英语       | 88     |
| 赵六       | 英语       | 68     |
+----------+----------+--------+

2 建表语句

sql 复制代码
--建表语句
create table if not exists t_student_score_13
(
    student string,
    subject string,
    score   bigint
)
    ROW FORMAT DELIMITED
        FIELDS TERMINATED BY ','
    STORED AS orc;

--插入数据

insert into t_student_score_13(student, subject, score)
values ('张三', '语文', 95),
       ('李四', '语文', 90),
       ('王五', '语文', 88),
       ('赵六', '语文', 77),
       ('张三', '数学', 80),
       ('李四', '数学', 90),
       ('王五', '数学', 92),
       ('赵六', '数学', 84),
       ('张三', '英语', 82),
       ('李四', '英语', 93),
       ('王五', '英语', 88),
       ('赵六', '英语', 68);

3 题解

  1. 查询学科排名、每个学生总成绩
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  |
+----------+----------+--------+-------------+--------------+
| 张三       | 语文       | 95     | 1           | 257          |
| 张三       | 英语       | 82     | 3           | 257          |
| 张三       | 数学       | 80     | 4           | 257          |
| 李四       | 语文       | 90     | 2           | 273          |
| 李四       | 英语       | 93     | 1           | 273          |
| 李四       | 数学       | 90     | 2           | 273          |
| 王五       | 语文       | 88     | 3           | 268          |
| 王五       | 英语       | 88     | 2           | 268          |
| 王五       | 数学       | 92     | 1           | 268          |
| 赵六       | 语文       | 77     | 4           | 229          |
| 赵六       | 英语       | 68     | 4           | 229          |
| 赵六       | 数学       | 84     | 3           | 229          |
+----------+----------+--------+-------------+--------------+
  1. 根据学生总分计算学生总排名
sql 复制代码
select student,
       subject,
       score,
       subject_rn,
       total_score,
       row_number() over (partition by subject order by total_score desc) as total_rn
from (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) t

执行结果

复制代码
+----------+----------+--------+-------------+--------------+-----------+
| student  | subject  | score  | subject_rn  | total_score  | total_rn  |
+----------+----------+--------+-------------+--------------+-----------+
| 李四       | 数学       | 90     | 2           | 273          | 1         |
| 王五       | 数学       | 92     | 1           | 268          | 2         |
| 张三       | 数学       | 80     | 4           | 257          | 3         |
| 赵六       | 数学       | 84     | 3           | 229          | 4         |
| 李四       | 英语       | 93     | 1           | 273          | 1         |
| 王五       | 英语       | 88     | 2           | 268          | 2         |
| 张三       | 英语       | 82     | 3           | 257          | 3         |
| 赵六       | 英语       | 68     | 4           | 229          | 4         |
| 李四       | 语文       | 90     | 2           | 273          | 1         |
| 王五       | 语文       | 88     | 3           | 268          | 2         |
| 张三       | 语文       | 95     | 1           | 257          | 3         |
| 赵六       | 语文       | 77     | 4           | 229          | 4         |
+----------+----------+--------+-------------+--------------+-----------+
  1. 查询每个学科的第三名

我们已经把所有需要的字段都查询出来了,只需要限定 subject_rn = 3 得到学科排名第三的同学记录即可。

sql 复制代码
select student,
       subject,
       score,
       total_score,
       total_rn
from (select student,
             subject,
             score,
             subject_rn,
             total_score,
             row_number() over (partition by subject order by total_score desc) as total_rn
      from (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) t) tt
where subject_rn = 3

执行结果

复制代码
+----------+----------+--------+--------------+-----------+
| student  | subject  | score  | total_score  | total_rn  |
+----------+----------+--------+--------------+-----------+
| 赵六       | 数学       | 84     | 229          | 4         |
| 张三       | 英语       | 82     | 257          | 3         |
| 王五       | 语文       | 88     | 268          | 2         |
+----------+----------+--------+--------------+-----------+
相关推荐
Tapdata6 分钟前
实时物化视图的新路径:从传统 Join 到跨源实时查询
数据库
optimistic_chen9 分钟前
【Java EE进阶 --- SpringBoot】Mybatis - plus 操作数据库
数据库·spring boot·笔记·java-ee·mybatis·mybatis-plus
FJW02081440 分钟前
关系型数据库大王Mysql——DDL语句操作示例
数据库·mysql
言之。40 分钟前
Chroma 开源的 AI 应用搜索与检索数据库(即向量数据库)
数据库·人工智能·开源
来旺1 小时前
互联网大厂Java面试全解析及三轮问答专项
java·数据库·spring boot·安全·缓存·微服务·面试
wudl55661 小时前
flink sql 所有函数详细用例
大数据·sql·flink
cr7xin2 小时前
基于Session和Redis实现短信验证码登录
数据库·redis·缓存
乌暮2 小时前
数据库--视图、索引
数据库
Web3&Basketball2 小时前
达梦数据库性能调优总结
数据库·oracle
-Xie-2 小时前
Mysql杂志(三十三)——锁
数据库·mysql