【MYSQL学习】面试题:查询每个班的第二名(考虑并列)的信息
2019-03-20 22:22
225 查看
查询每个班的第二名(考虑并列)
数据源
create table s1 ( id int, name varchar(10), score int, classno int) insert into s1 values (1,xxj,100,1), (2,xxj2,100,1), (3,xxj3,99,1,), (4,xxj4,99,1), (5,xf,99,2), (6,xf2,98,2), (7,xf3,98,2), (8,xz,100,3), (9,xz2,98,3)
方法一:使用dense_rank() over() 函数
四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)
这里主要用到dense_rank(),dense_rank函数出现相同排名时,不跳过相同排名号,rank值紧接上一次的rank值。这正是我们所需要的。
语法:
select DENSE_RANK() OVER (partition by [classno] order by [score]) as den_rank,* from [s1]
具体SQL:
select * from (select dense_rank() over (partition by classno order by score desc) as rankk,s1.name,s1.score,s1.classno,s1.id from s1 ) as s2 where rankk = 2;
方法二:子查询
刚看到这道题不知道有这个函数,只想着用子查询解决该问题,想法是首先查询出每个班的第一名的分数max(score),再查询除去刚刚查询出的第一名分数的max(score)也就是第二名,找到所需信息即可。
为了避免特殊情况,再构建数据源时考虑了三种情况,一个班两个并列第一,一个班两个并列第二,一个班一个第一一个第二,同时分数存在一个班的第二名可能是另一个班的第一名。尽量把所有情况都考虑到。
代码如下:
select max(score) as second,classno from s1 where score not in ( SELECT max(score) FROM s1 group by classno) group by classno;
结果选不出1班的第二名,因为1班的第二名是二班的第一名,所以这种方法考虑不全面,不正确。
如果有不用函数来解决这个问题的方法,欢迎指导~~很想知道有没有构建子查询的方法!
相关文章推荐
- mysql学习笔记-创建用户以及登录,基本信息查询
- [MySQL]学习笔记- 用户行为表中,查询每个人的一条最新行为(分组 排序 取时间最大的一条记录)
- Android 学习意外第五季<1>——gps定位经纬度查询地址信息
- Mysql学习笔记(五)数据查询之测试sql部分。
- ORACLE和MYSQL查询表字段信息的sql
- mysql学习(5)数据库多表查询
- 【数据库学习笔记】MySQL_02_查询,约束
- MySQL学习笔记——对查询结果进行排序
- mysql优化(1)show命令 慢查询日志 explain profiling(查看CPU、DISK I\O等信息)
- Mysql学习总结(8)——MySql基本查询、连接查询、子查询、正则表达查询讲解
- mysql分类查询每个分类的两条记录
- 【学习笔记】mysql查询执行的基础
- MySQL中查询日志与慢查询日志的基本学习教程
- Mysql中DATE_SUB 使用方法结合查询一天内,一周内,一月内的信息实例讲解
- 查询每个部门最低工资的雇员信息
- MYSQL学习心得(6) -- SQL子查询的一些例子
- python-MySQL学习笔记-第四章-利用Connector/Python来查询数据
- MySQL分数排名同分并列与不并列查询
- 小菜鸟的python学习之路----信息查询系统
- 《Advanced Bash-scripting Guide》学习(十):利用whois查询域名信息