mysql查询学科_查询出各个学科的前3名的同学信息的Sql
查找各个学科的成绩前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相关推荐
- 查询出各个学科的前3名的同学信息的Sql
查找各个学科的成绩前3名的学生信息Sql,有2种方法,一种是利用sql的row_number() over()函数,另一种是用子查询, 表设计如下 如果不考虑各个学科的成绩有并列的情况的话,有如下两种 ...
- mysql hql查询语句_查询hql语句
Hibernate-HQL 了解HQL 一.HQL定义 1.Hibernate QueryLanguage,Hibernate查询语言 2.HQL是面向对象的查询语言 3.HQL提供了丰富灵活的查询特 ...
- 查询mysql版本好_查询mysql版本(select查mysql版本)
查询mysql版本(select查mysql版本) 2020-07-24 11:32:47 共10个回答 1.通过mysql的-V参数查询版本信息mysql-V2.登录mysql时可以查询版本信息my ...
- 达梦数据查询编码_查询数据库的编码方式
在Mysql中 (1)查看Mysql数据库编码 show variables like 'character_set_database' 或者 show create database 数据库名称 ( ...
- mysql 排名_学会在MySQL中实现Rank高级排名函数,所有取前几名问题全部解决.
MySQL中没有Rank排名函数,当我们需要查询排名时,只能使用MySQL数据库中的基本查询语句来查询普通排名.尽管如此,可不要小瞧基础而简单的查询语句,我们可以利用其来达到Rank函数一样的高级排名 ...
- mysql怎么看实例名_南方“中看不中吃”的前4名水果,莲雾只是垫底,你怎么看?...
水果很多人都喜欢吃,南方人可以说是最幸福的,因为南方的水果种类有很多种,而且水果的价格也很便宜,一年四季都能吃到便宜又好吃的水果,南方的很多水果,北方人可能都没有吃过,虽然南方的水果种类多,但是也有一 ...
- oracle语句mysql数据库名称_查询oracle数据库中当前数据库所有表的名称
SQL查询数据库中所有指定类型的字段名称和所在的表名 --查询数据库中所有指定类型的字段名称和所在的表名 --eg: 下面查的是当前数据库中 所有字段类型为 nvarchar(max) 的字段名和表名 ...
- mysql session 数_查询数据库当前连接数(session),进程数等操作
查询当前数据库连接数,进程数,启动数据库 查询数据库当前进程的连接数: select count(*) from v$process; 查看数据库当前会话的连接数: elect count(*) fr ...
- mysql上年年末_查询年初,年末,去年年初,明年年初与年末sql语句
查询年初,年末,去年年初,明年年初与年末sql语句 查询年初,年末,去年年初,明年年初与年末sql语句 --年度计算 declare @date datetime set @date=getdate( ...
最新文章
- C/C++结构体字节对齐详解
- 自律到极致-人生才精致:第4期
- python手机版安卓-当python遇到Android手机 那么,万物皆可盘
- “约见”面试官系列之常见面试题之第六十二篇之IE和兼容下写法(建议收藏)
- 学习日报 1026 使用属性升级MyBank
- mysql配置master_mysql 主从配置(master/slave)
- 补码加减法判断进位判断是否溢出的总结
- 图论算法——Prim算法和Kruskal算法
- 设计模式--迭代器模式(C++实现)
- 计算机涉及数学知识点,2019计算机考研数学知识点解读:一元函数积分学
- html中图片为什么反了,HTML5 canvas如何实现图片反色
- 开题报告的选题依据怎么写?
- 【游戏开发实战】教你使用Unity实现录屏生成GIF的功能,录个妹子跳舞的GIF吧
- 微信支付之Native扫码支付功能
- vivado中实现VGA驱动学习笔记
- python排版_Python|图形排版
- 给上层添加SuperSu来获取root权限
- ExtJS的History使用
- 【java】《java编程思想》 读书笔记
- 阿里云AMD服务器计算型实例规格族c6a实例CPU网络收发包云盘IOPS详解