查找各个学科的成绩前3名的学生信息Sql,有2种方法,一种是利用sql的row_number() over()函数,另一种是用子查询,

表设计如下

如果不考虑各个学科的成绩有并列的情况的话,有如下两种方法进行查询,

1. ROW_NUMBER() OVER()函数

select * from (

select ROW_NUMBER() OVER(partition by CourseName ORDER BY Score desc) AS rownum,* from MyTest

) as a

where rownum < 4

order by CourseName

结果如下图

2. 子查询

select * from MyTest m

where id in (select top 3 id from MyTest n where n.CourseName = m.CourseName order by Score desc)

order by CourseName,Score desc

结果如下图

可以看出,当各个学科的前三名所得分数没有相同时,以上2种方法都可以,但如果某个科目有相同的分数时,

所得结果就会出现不一致的情况,如张三和刘德华的数学分数都是70分,第一个查出的前三名包括刘德华,而第二个查询前三名却包括张三

要解决以上问题,可以运用Sql的 rank() OVER()或dense_rank() OVER()函数进行查询,

具体是使用这2个方法中的哪一个要看具体的结果需求,可以先了解下这2个函数的具体用法再决定用哪个更合适,

我这里以 rank() OVER() 函数为例,解决方法如下:

1.

select * from (

select rank() OVER(partition by CourseName ORDER BY Score desc) AS rownum,* from MyTest

) as a

where rownum < 4

order by CourseName

结果如下图

这时就可以看到数学一课中,得分都为70的刘德华和张三都被查询到了

如果使用dense_rank() OVER()函数,语句如下

select * from (

select dense_rank() OVER(partition by CourseName ORDER BY Score desc) AS rownum,* from MyTest

) as a

where rownum < 4

order by CourseName

结果如下图

原因在于dense_rank() OVER()与 rank() OVER()对于重复的数据编号时的处理方式不同,

rank()碰到重复的记录时编码下一个记录时会跳数字,而dense_rank() OVER()则不会,

如用rank() OVER()如下

select rank() OVER(partition by CourseName ORDER BY Score desc) AS rownum,* from MyTest

结果如下图

注意看数学学科的按分数排名的规则

如果使用dense_rank() OVER(),

select dense_rank() OVER(partition by CourseName ORDER BY Score desc) AS rownum,* from MyTest

结果如下图

另外,对于子查询方式,对于重复分数的记录,如果我们查询各个学科的前3名时也想查询出来,可以使用以下改进的语句,如

with a as (

select distinct CourseName,Score from MyTest m

where id in (select top 3 id from MyTest n where n.CourseName = m.CourseName order by Score desc)

--order by CourseName,Score desc

)

select m.*

from MyTest m join a n

on m.CourseName = n.CourseName

and m.Score = n.Score

order by CourseName,Score desc

结果如下图

这种写法类似于使用Sql函数rank() OVER()的情况。

mysql查询学科_查询出各个学科的前3名的同学信息的Sql相关推荐

  1. 查询出各个学科的前3名的同学信息的Sql

    查找各个学科的成绩前3名的学生信息Sql,有2种方法,一种是利用sql的row_number() over()函数,另一种是用子查询, 表设计如下 如果不考虑各个学科的成绩有并列的情况的话,有如下两种 ...

  2. mysql hql查询语句_查询hql语句

    Hibernate-HQL 了解HQL 一.HQL定义 1.Hibernate QueryLanguage,Hibernate查询语言 2.HQL是面向对象的查询语言 3.HQL提供了丰富灵活的查询特 ...

  3. 查询mysql版本好_查询mysql版本(select查mysql版本)

    查询mysql版本(select查mysql版本) 2020-07-24 11:32:47 共10个回答 1.通过mysql的-V参数查询版本信息mysql-V2.登录mysql时可以查询版本信息my ...

  4. 达梦数据查询编码_查询数据库的编码方式

    在Mysql中 (1)查看Mysql数据库编码 show variables like 'character_set_database' 或者 show create database 数据库名称 ( ...

  5. mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.

    MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...

  6. mysql怎么看实例名_南方“中看不中吃”的前4名水果,莲雾只是垫底,你怎么看?...

    水果很多人都喜欢吃,南方人可以说是最幸福的,因为南方的水果种类有很多种,而且水果的价格也很便宜,一年四季都能吃到便宜又好吃的水果,南方的很多水果,北方人可能都没有吃过,虽然南方的水果种类多,但是也有一 ...

  7. oracle语句mysql数据库名称_查询oracle数据库中当前数据库所有表的名称

    SQL查询数据库中所有指定类型的字段名称和所在的表名 --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 ...

  8. mysql session 数_查询数据库当前连接数(session),进程数等操作

    查询当前数据库连接数,进程数,启动数据库 查询数据库当前进程的连接数: select count(*) from v$process; 查看数据库当前会话的连接数: elect count(*) fr ...

  9. mysql上年年末_查询年初,年末,去年年初,明年年初与年末sql语句

    查询年初,年末,去年年初,明年年初与年末sql语句 查询年初,年末,去年年初,明年年初与年末sql语句 --年度计算 declare @date datetime set @date=getdate( ...

最新文章

  1. C/C++结构体字节对齐详解
  2. 自律到极致-人生才精致:第4期
  3. python手机版安卓-当python遇到Android手机 那么,万物皆可盘
  4. “约见”面试官系列之常见面试题之第六十二篇之IE和兼容下写法(建议收藏)
  5. 学习日报 1026 使用属性升级MyBank
  6. mysql配置master_mysql 主从配置(master/slave)
  7. 补码加减法判断进位判断是否溢出的总结
  8. 图论算法——Prim算法和Kruskal算法
  9. 设计模式--迭代器模式(C++实现)
  10. 计算机涉及数学知识点,2019计算机考研数学知识点解读:一元函数积分学
  11. html中图片为什么反了,HTML5 canvas如何实现图片反色
  12. 开题报告的选题依据怎么写?
  13. 【游戏开发实战】教你使用Unity实现录屏生成GIF的功能,录个妹子跳舞的GIF吧
  14. 微信支付之Native扫码支付功能
  15. vivado中实现VGA驱动学习笔记
  16. python排版_Python|图形排版
  17. 给上层添加SuperSu来获取root权限
  18. ExtJS的History使用
  19. 【java】《java编程思想》 读书笔记
  20. 阿里云AMD服务器计算型实例规格族c6a实例CPU网络收发包云盘IOPS详解

热门文章

  1. PTA基础编程题目集
  2. Unity 打包快手
  3. 计算机主机恢复上电检查,电脑故障维修判断指导总结
  4. 计算机主机电源故障分析检测维修,电源故障:台式机电脑电源故障检修
  5. 亲身经历:一次sql缺少where条件的惨案,绩效奖金差点没啦~
  6. 面试题---C/C++与单片机
  7. Cadedce Allegro 里面怎么切线删除一条线上的某一段
  8. 【技术推荐】WebLogic 反序列化漏洞深入分析
  9. 专转本-计算机二级习题2
  10. Coursera无法播放视频问题的解决