查找各个学科的成绩前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()的情况。

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

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

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

  2. mysql中查询名字第二位为_(12) 查询出名字倒数第二位为S的员工信息。_学小易找答案...

    [单选题]排序用到的表空间是 ( ) [填空题]设有如下关系表R: R(NO,NAME,SEX,AGE,CLASS) 主关键字是NO 其中NO为学号,NAME为姓名,SEX为性别,AGE为年龄,CLA ...

  3. 爬虫(二):用python爬取亚马逊所有家具种类前100名的商品信息(下)

    目标 亚马逊公司(Amazon),是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图,是网络上最早开始经营电子商务的公司之一,现在已成为全球商品品种最多的网上零售商和全球第二大互联网企业. 本次目 ...

  4. python爬虫(一)爬取豆瓣电影排名前50名电影的信息

    python爬虫(一)爬取豆瓣电影排名前50名电影的信息 在Python爬虫中,我们可以使用beautifulsoup对网页进行解析. 我们可以使用它来爬取豆瓣电影排名前50名的电影的详细信息,例如排 ...

  5. mysql查询库中所有的表名,mysql查询指定表中的所有字段名及其相关信息

    SHOW TABLES FROM jzee; 可以在hibernate中作为sql语句查询出结果. 从jzee库中查出所有表名. 查询结果: select COLUMN_NAME,COLUMN_COM ...

  6. 爬虫(一):用python爬取亚马逊所有家具种类前100名的商品信息(上)

    目标 亚马逊公司(Amazon),是美国最大的一家网络电子商务公司,位于华盛顿州的西雅图,是网络上最早开始经营电子商务的公司之一,现在已成为全球商品品种最多的网上零售商和全球第二大互联网企业. 本次目 ...

  7. mysql语句求排名前五的同学的姓名_求出每门课程成绩排名前五名的同学的姓名,分数和课程名?...

    首先解决此种需求的查询要根据自己的业务或者需求,如果要是业务处理的话就简单多了.还有一个是mysql,一个是ORACL两种数据库,sqlserver我到没有研究,应该也有.笨方法多多包涵 MYSQL的 ...

  8. MySQL三表查询(学生表、课程表、成绩表)查询出语文成绩比数学成绩高的学生信息

    有三张表 学生表 课程表 成绩表 要求查处语文成绩低于数学成绩的学生信息 先去课程表中查出课程cid select cid from course where cname='语文'; select c ...

  9. mysql每学科前两名 having_mysql 分组查询前n条数据

    今天去面试,碰到一道面试题: 有一个学生成绩表,表中有 表id.学生名.学科.分数.学生id .查询每科学习最好的两名学生的信息: 建表sql: CREATE TABLE `stuscore` ( ` ...

最新文章

  1. Java NIO之Selector(选择器)
  2. 20160208.CCPP体系具体解释(0018天)
  3. 浅析制造业物料编码在ERP系统中的实施
  4. RTEMS 的 AT91SAM9260 移植(5): 调试串口驱动
  5. Spring中HibernateTemplate类的使用
  6. 计算机科学与技术范文,计算机科学与技术专业(范文).doc
  7. 可以在电脑上刷微信朋友圈啦-微信 mac最新版
  8. 计算平均指令时间_上海原油期货将推出TAS指令
  9. 1526 B. I Hate 1111
  10. 版号审批重启,游戏行业有望尽早度过寒冬?
  11. 青少年CTFmisc 简简单单的题目
  12. mysql什么时候用不到索引
  13. greenplum常用的gp_toolkit监控语句
  14. 06人月神话读书笔记之二
  15. 阴天(唐伯虎点秋香版)1铃声 阴天(唐伯虎点秋香版)1手机铃声免...
  16. 技术文章系列整理(持续更新)
  17. xk是什么意思_xk车牌号是什么意思 xk车牌号码的含义
  18. 计算机软件著作权的价值,计算机软件著作权登记费是多少
  19. ArcGIS和Global Mapper中按分幅图框进行批量DOM分幅裁剪命名(附练习数据)
  20. Oracle EBS R12 GL总帐模块 核心标准表(Table)

热门文章

  1. 九度OJ1005题 一直WA??
  2. [软件工程]在线教程
  3. 测试用例-其他相关知识
  4. webkit内核Android,Opera发布全新基于WebKit内核的安卓版浏览器
  5. docker hub push_Docker系列-(2) 镜像制作与发布
  6. arduino液位传感器_如何使用Arduino + VL53L0X来制作液位感应设备
  7. java 表达式写法_java内置核心4大函数式接口写法和lambda表达式
  8. 金融数据分析与挖掘实战4.1 Matplotlib(一)
  9. 码匠编程:零基础从前端入门到前端开发工程师路线
  10. 【C语言】在线OJ题 BC72-BC87-牛客网编程初学者入门训练