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         |
+----------+----------+--------+--------------+-----------+
相关推荐
NineData3 分钟前
DTCC 2026 NineData 叶正盛:如何统一管理人与 AI Agent 的数据访问行为
数据库·人工智能·sql·oracle·agent·ninedata·dtcc
一入程序无退路13 分钟前
Navicat导出Excel格式表名表结构
数据库·excel
记忆张量MemTensor13 分钟前
MemOS Skill 上线|一句话即可接入 MemOS Cloud
大数据·数据库·人工智能·typescript·开源
朋友圈自动点赞工具26 分钟前
NAS游戏库自动下载新方案,Questarr部署教程
服务器·数据库·游戏·科技资讯
LadiesAndGentlemen1 小时前
概览篇:世界模型、空间智能与地理空间智能是什么关系
数据库·人工智能·自然语言处理·开源·aigc
昌原的儿子LEO1 小时前
Linux进程知识点总结
linux·服务器·c语言·数据库
Databend1 小时前
Cluster Key 最佳实践:列怎么选、顺序怎么排与粒度设计
大数据·数据库·sql
三8441 小时前
WordPress REST API 参数校验机制剖析:为什么 author__not_in 无法直接盲注?
服务器·前端·数据库
kobe_OKOK_2 小时前
ubuntu server 打包成一个压缩文件,并且在另一台电脑中解压缩
服务器·数据库·ubuntu