SQL练习题_ 查询每个部门工资最高的前两名的姓名和部门名称【多测师_何sir】
查询每个部门工资最高的前两名的姓名和部门名称
- 第一种解决方案:
- 第二种解决方案:
SQL练习题:
假设一个部门有4个人,A,B,C,D
A的工资=10000
B的工资=9000
C的工资=8000
D的工资=7000
问题:现在要找出这个部门工资最高的两个人
第一种解决方案:
SELECT e.*,d.*
FROMemp e WHERE (SELECT COUNT(*) FROMemp p WHERE e.dept2 = p.dept2 AND e.incoming < p.incoming) < 2
ORDER BY sid,e.incoming ;
方案解析:
根据题目的要求分析,可以得出下面两条结论,满足这两条结论的人就是要找的前两人:
1,比第一高工资高的人为0个,count的数量<2
2,比第二高工资高的人为1个,count的数量<2
那么现在开始比较(e.incoming < p.incoming),
1,A和部门里面所有的人进行对比,并对比对的结果进行统计。
A<A false
A<B false
A<C false
A<D false
统计结果,count的数量的为0
那么根据上面的结论 A满足第一条结论。
2,B和部门里面所有的人进行对比,并对比对的结果进行统计。
B<A true
B<B false
B<C false
B<D false
统计结果,count的数量为1
那么根据上面的结论 B满足第二条结论。
3,C和部门里面所有的人进行对比,并对比对的结果进行统计。
C<A true
C<B true
C<C false
C<D false
统计结果,count的数量为2
那么根据上面的结论 C不满足两条结论。
4,D和部门里面所有的人进行对比,并对比对的结果进行统计。
D<A true
D<B true
D<C true
D<D false
统计结果,count的数量为3
那么根据上面的结论 D不满足两条结论。
那么最终比对完成后满足结论的就只有A和B
第二种解决方案:
SELECT bb.* FROM
(SELECT (@j:=@j+1) pm,s.* FROM emp s,(SELECT @j:=0)t GROUP BY sid ORDER BY dept2 ASC ,incoming DESC
)bb
INNER JOIN
(SELECT tt.dept2,MIN(tt.pm) pm FROM (SELECT (@i:=@i+1) pm,s.* FROM emp s,(SELECT @i:=0)t GROUP BY sid ORDER BY dept2 ASC ,incoming DESC)tt GROUP BY tt.dept2
)cc
ON cc.dept2 = bb.dept2 WHERE bb.pm < cc.pm + 2
方案解析:
1,添加排名伪列
例如:
姓名 | 部门ID | 工资 |
---|---|---|
A | 1 | 9000 |
B | 1 | 8000 |
C | 1 | 10000 |
D | 1 | 7000 |
执行如下SQL:
SELECT (@j:=@j+1) pm,s.* FROM emp s,(SELECT @j:=0)t GROUP BY sid ORDER BY dept2 ASC ,incoming DESC
得到临时bb表
PM | 姓名 | 部门ID | 工资 |
---|---|---|---|
1 | C | 1 | 10000 |
2 | A | 1 | 9000 |
3 | B | 1 | 8000 |
4 | D | 1 | 7000 |
2,求出一个部门排名第一的
执行如下SQL:
SELECT tt.dept2,MIN(tt.pm) pm FROM
(SELECT (@i:=@i+1) pm,s.* FROM emp s,(SELECT @i:=0)t GROUP BY sid ORDER BY dept2 ASC ,incoming DESC
)tt GROUP BY tt.dept2
得到临时cc表
PM | 部门ID |
---|---|
1 | 1 |
3,临时表对比排名求出结果(WHERE bb.pm < cc.pm + 2)
这里+2的目的就是要求前几名就+多少。比如前两名就+2,前三名就+3
最终结果:
PM | 姓名 | 部门ID | 工资 |
---|---|---|---|
1 | C | 1 | 10000 |
2 | A | 1 | 9000 |
SQL练习题_ 查询每个部门工资最高的前两名的姓名和部门名称【多测师_何sir】相关推荐
- mysql 查询前两名_Mysql:查询每门课程成绩的前两名
一张成绩表,查询每门课程的前两名,咋一看无从下手,其实可以理解为表自连接 . 建表语句: CREATE TABLE `Department` ( `Id` int(11) NOT NULL DEFAU ...
- python:使用任意语言,递归地将某个磁盘目录下的 jpeg 文件的扩展名修改为 jpg【杭州多测师_王sir】【杭州多测师】...
1.使用 Shell 命令,从 example.log 日志文件中,统计最后 100 行内,包含 "test" 字符串的行数 2.使用任意语言,递归地将某个磁盘目录下的 jpeg ...
- mysql每学科前两名 having_mysql 分组查询前n条数据
今天去面试,碰到一道面试题: 有一个学生成绩表,表中有 表id.学生名.学科.分数.学生id .查询每科学习最好的两名学生的信息: 建表sql: CREATE TABLE `stuscore` ( ` ...
- mysql查询每个部门工资最高的员工信息_SQL简单面试题:查询每个部门工资最高的前10位员工...
前段时间同事突然甩了一个SQL面试题给我,题目是需要查询每个部门工资最高的前10位员工.想着查每个部门的最高还好,用max语句就可以搞定,这是要取前十.... 快速构建了一下思路,查了一下有没有类似的 ...
- mysql查询每门功课成绩最好的前两名_用一个SQL查询语句得出每门功课成绩最好的前两名 - SQL Server论坛 - 51CTO技术论坛_中国领先的IT技术社区...
有一个学生表,里面有 学号 功课编号 学生成绩三个字段. 用一个SQL查询语句得出每门功课成绩最好的前两名 学号 功课编号 学生成绩 1 1 99 ...
- mysql查询选课程的学生学号和姓名_数据库SQL语句中查询选修了全部课程的学生的学号和姓名理解...
首先头脑中有三点概念: 1.EXISTS子查询找到的提交 NOTEXISTS子查询中找不到的提交 说明:不要去翻译为存在和不存在,把脑袋搞晕. 2.建立程序循环的概念,这是一个动态的查询过程.如FOR ...
- 【sql: 练习题 28 ,29】查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况),查询任何一门课程成绩在 70 分以上的姓名、课程名称和分数...
题目:查询所有学生的课程及分数情况(存在学生没成绩,没选课的情况) 分析: 这个应该是student表 和 student_score表进行联合查询,因为存在学生没成绩,没选课的情况,所以要用lef ...
- 查询成绩最好的前两名_SQL查询整理
SQL查询相关知识整理 习题中会用到的表 一.简单查询 1.查询姓"猴"的学生名单 select 学号,姓名 from student where 姓名 like '猴%': 2. ...
- Java Spring框架入门详解教程【多测师_何sir】
Spring框架入门详解教程 spring概述 spring结构 spring IOC spring DI spring概述 Spring是一个非常活跃的开源框架, 它是一个基于IOC和AOP来构架多 ...
最新文章
- layui时间怎么设置年月日时分秒_layui-laydate时间日历控件使用方法详解
- 学会python爬虫怎么赚钱-学会python爬虫怎么赚钱
- 错误The type XXX is deprecated解决
- fluent p1模型_Fluent辐射传热模型理论以及相关设置-转载 于 作者:Libo Chen
- [51CTO]给您介绍Windows10各大版本之间区别
- icpc网络赛第二场K Meal
- CodeForces - 796D Police Stations bfs
- 深度残差网络的无人机多目标识别
- Redis(十):Redis特殊类型之Hyperloglog基数统计
- CSS 背景图片 设置居中
- mysql linux 数据库文件位置_mysql在linux下修改mysql数据库文件位置
- java 中方法的使用,两个实例教你学会java中方法的使用
- Windows移动开发(三)——闭关修炼
- nginx源码安装及配置https自签名
- 计算机管理 没有初始化,win7系统电脑新增的硬盘没有初始化的解决方法
- Can not import avx core while this file exists
- 网工行业里的多面手,数据通信工程师2022年最新系统学习路线整理
- Springboot 整合百度地图 API
- cortex a7 a53_试驾初体验--我与奥迪A7的七天之旅
- 五种提前还款方式那种更划算