当前位置: 首页 > news >正文

查询每门课程最好的前两名的SQL实现

需求:查询每门课程分数排名前两名的学生,表名Sc(字段:c_no课程号、s_no学号、score分数)

一、整体语句拆分

sql

-- 外层查询:取出最终结果 select a.c_no,a.s_no,a.score from Sc a -- 核心:关联子查询做排名筛选 where (select count(distinct score) from Sc b where b.c_no=a.c_no and b.score>=a.score) <= 2 -- 最后按课程、分数倒序排列 order by a.c_no,a.score desc ;

二、核心逻辑(相关子查询 + 分数去重排名

1. 别名说明

  • a:外层表,遍历每一条成绩记录
  • b:内层表,和a同一张成绩表,用来做对比统计

2. 子查询拆解(最关键部分)

sql

select count(distinct score) from Sc b where b.c_no=a.c_no and b.score>=a.score
  1. b.c_no = a.c_no只对比同一门课程的成绩,不同课程互不干扰。

  2. b.score >= a.score统计:当前这门课中,分数 ≥ 当前学生分数 的所有不同分数有多少个

  3. distinct score对分数去重,代表按「分数档位」排名,不是按人数排名。

  4. count(...)统计出「大于等于当前分数的不同分数个数」,这个数字就是当前分数的名次

3.where 个数 <= 2筛选条件

只保留名次为第 1、第 2 名的记录,也就是每门课前两名。


三、举个例子直观理解

假设课程001成绩数据:

表格

c_nos_noscore
0010195
0010295
0010390
0010485
  1. 遍历a= (001,01,95)子查询:统计课程 001 中score>=95不同分数→ 只有95count = 11<=2,保留这条数据。

  2. 遍历a= (001,02,95)同理count=1→ 保留。

  3. 遍历a= (001,03,90)子查询:score>=90的分数:95、90 →count=22<=2,保留。

  4. 遍历a= (001,04,85)分数:95、90、85 →count=3→ 不保留。

最终结果:95 分两人 + 90 分一人,全部查出(同分并列靠前)。


四、语句特点 & 优缺点

优点

  1. 纯标准 SQL,兼容所有数据库(MySQL、Oracle、SQL Server 都能用)
  2. 实现同分并列排名(经典DENSE_RANK效果)

缺点

  1. 性能差:属于相关子查询,外层每一行都会执行一次子查询,数据量大时很慢。
  2. 逻辑只适用于「按分数档位排名」,和 “按人数取前 2” 有区别。

五、补充:两种排名场景区别(易踩坑)

  1. 本语句效果:按分数排名(并列不占位)多人同分第一,依然都算在前两名内。
  2. 如果需求是「最多取 2 条记录(按人数取前 2)」这条 SQL 不适用,需要改用窗口函数(row_number())。

六、现代写法(MySQL8.0+/Oracle 推荐,性能更好)

用窗口函数替代子查询,逻辑更清晰、效率更高:

sql

-- 每门课按分数倒序排名,取前2名(并列排名) SELECT c_no, s_no, score FROM ( SELECT c_no, s_no, score, DENSE_RANK() OVER(PARTITION BY c_no ORDER BY score DESC) rk FROM Sc ) t WHERE rk <= 2;
http://www.zskr.cn/news/1526291.html

相关文章:

  • 2026年 东莞UV打印/亚克力UV打印/UV打印加工/UV彩白彩玻璃贴最新推荐榜单:高精度工艺与创意透光的品质之选 - 品牌发掘
  • OpenCore Legacy Patcher解决方案:为老款Mac注入新生命,体验最新macOS系统
  • 设计系统中的主题切换:从 CSS 变量到运行时主题引擎的架构实践
  • 打造你的AI灵魂伴侣:SillyTavern角色卡片完全指南
  • 搭建本地 apt 源
  • 别再只调solvePnP了!深入对比EPnP、IPPE等6种算法在无人机着陆标志识别中的精度与速度
  • 安能物流200公斤跨省邮寄多少钱?安能物流200公斤跨省运费多少?省钱技巧来了 - 快递物流资讯
  • ctf show web入门115
  • 118、【Agent】【OpenCode】项目配置(重复依赖分析)
  • 从写完就发到AI发布策略_CSDN_AI数字营销让内容分发变了什么
  • 免费IDM激活脚本完整指南:一键解锁下载加速器
  • Nature 子刊观点:AI 检测让论文写作陷入两难
  • 3步实现缠论自动分析:通达信免费插件实战指南
  • 如何让Paperless-ngx说你的语言:从中文界面到多语言文档管理
  • 微信社交关系管理神器:3分钟检测谁删了你,告别单向好友烦恼
  • 2026免费音频转AMR在线保姆级教程!无限制工具手把手教学,老旧录音笔也能轻松播放 - 时时资讯
  • 2026免费视频转AVI在线保姆级教程!无限制工具手把手教学,老式影碟机/U盘即插即播 - 时时资讯
  • MPC7450缓存架构与MPX总线设计:从原理到工程实践
  • 京东寄大件物流怎么收费?超全省钱攻略来了 - 快递物流资讯
  • 软件开发全链路效能提升实战指南
  • 2026年双螺杆造粒机五大主流厂家深度实测对比(技术参数、场景适配、运维成本) - 小艾信息发布
  • 2020年软考-集团分公司管理—软件设计师—东方仙盟
  • GSV2221@ACP#DP 1.4 MST 多屏转换芯片,物理 AI 多模态交互的视觉中枢
  • GSV2231@ACP#三屏 DP 1.4 MST 转换芯片,物理 AI 多任务协同的扩展核心
  • 告别重复安装!利用Python虚拟环境(venv)一劳永逸管理你的项目依赖
  • Java毕设选题推荐:基于 B/S 架构的校园信息交流共享系统的设计与实现 依托 SpringBoot 技术的校园资讯推送共享系统【附源码、mysql、文档、调试+代码讲解+全bao等】
  • 满心禧月子中心资质证书查哪些|月子中心资质怎么核实才靠谱 - 品牌观察
  • League Akari:英雄联盟客户端的终极一体化工具箱
  • 好客搜整体介绍——一家真正为企业营销赋能的AI技术公司
  • PlotNeuralNet实战:5分钟为你的YOLOv8/Transformer模型定制专属结构图(Python3.10+)