获取当前薪水第二多的员工的emp_no以及其对应的薪水
该文章主要记录在学习SQL的过程,觉得比较好的一个SQL题,作为记录学习。
题目背景:
请你获取薪水第二多的员工的emp_no以及其对应的薪水salary,
若有多个员工的薪水为第二多的薪水,则将对应的员工的emp_no和salary全部输出,并按emp_no升序排序。
数据集如下;
有一个薪水表salaries简况如下:
emp_no | salary | from_date | to_date |
10001 | 88958 | 2002-06-22 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 43311 | 2001-12-01 | 9999-01-01 |
如下提供三种方法,其中第一种方法明显有缺陷,仅供参考学习,也避免避坑。
第一种方法:该方法为错误的解决方案
select emp_no,salary
from salaries
where to_date = '9999-01-01'
order by salary desc limit 1,1
//salary降序排列,从1+1的位置取一个记录
第二种方法:通过去重的方式,对salary进行去重的方式排序后,再筛选。
select emp_no, salary from salaries
where to_date = '9999-01-01' and salary =
(select distinct salary from salaries order by salary desc limit 1,1)
第三种方法:通过使用排序窗口函数,该方法为自己在测试的时候用的,测试通过。
select f.emp_no,f.salary from
(select emp_no, salary,dense_rank()over(order by salary desc )
as emp_num from salaries ) f where f.emp_num = 2
注意:以下提供两种方法,限定在不能使用排序函数order by的情况进行,故上述的两种方法又不能使用。
第四种方法:通过建立多次的子查询。
selcet s.emp_no,s.salary from salaries s
where s.salary =
(selcet max(s.salary) from salaries s where s.salary < #定位出第二大的薪水信息
(select max(s.salary) from salaries) #定位出第一大的薪水信息
这种方法适合TOP查询,一旦多了之后,子查询的次数过多,是该方法的弊端。
第五种方法:该方法稍微烧脑一些,用到的方法为表的自连接。在讲述表的自连接时,先说明下表连接的几种方式,参考文章。逐步演示其过程
1)源数据表如下:
emp_no | salary | from_date | to_date |
10001 | 88958 | 2002-06-26 | 9999-01-01 |
10002 | 72527 | 2001-08-02 | 9999-01-01 |
10003 | 43311 | 2001-12-01 | 9999-01-01 |
10004 | 74057 | 2001-11-27 | 9999-01-01 |
2)表的自连接(交叉连接查询)select * from salary s1 ,salary s2;
3)select * from salary s1 ,salary s2 where s1.salary<=s2.salary;在自连接的情况下,定位出比自己大的那部分数据。
4)在通过分组的方式,count统计在每个组的数量(由于每个组下,自连接表里的数据都是大于等于自己的,虽然自连接表2中没有进行排序,但通过计数统计却能实现在当前组别下,自己是第几,因为自己总是在最后一名)。
select s1.salary,s1.emp_no,count(distinct s2.salary) as emp_num
from salary s1 ,salary s2 where s1.salary<=s2.salary group by s1.salary;
最后在通过where查询得出我们想要的结果。
获取当前薪水第二多的员工的emp_no以及其对应的薪水相关推荐
- 《数据库SQL实战》获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary
题目描述 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary CREATE TABLE salaries ( emp_no int(11) ...
- [SQL实战]之获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
题目描述 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary CREATE TABLE salaries ( emp_no int(11) ...
- SQL18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary
原题连接: https://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719?tpId=82&&tqId=29770 ...
- SQL-18 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by...
题目描述 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不准使用order by CREATE ...
- [SQL实战]之查找当前薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by
题目描述 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不准使用order by CREATE ...
- 查找薪水第二多的员工基本信息
题目描述查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不准 使用 order by CREAT ...
- 此处不允许使用分组函数_查找当前薪水排名第二多的员工信息(不使用order by和窗口函数)...
题目描述 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,你可以不使用order by完成吗 C ...
- 数据库SQL实战11_获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01‘, 结果第一列给出员工的emp_no, 第二列给出其manager
题目 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01', 结果第一列给出员工的emp_no, 第二列给出其manager的manager_ ...
- SAL-9 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01'...
题目描述 获取所有部门当前manager的当前薪水情况,给出dept_no, emp_no以及salary,当前表示to_date='9999-01-01' CREATE TABLE `dept_ma ...
最新文章
- Django搭建个人博客:渲染Markdown文章目录
- javaweb项目中的过滤器的使用
- JQuery图片无限循环滚动源码
- 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
- 如何控制并发和控制死锁(内含pb的处理要点)
- 读书笔记-JavaScript高级程序设计(1)
- apt-get无法下载,一些网址Not Found 404
- php 验证微信token_php之微信公众号验证token获取access_token
- mysql存储引擎中INNODB和MyISAM的区别
- 开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!
- django配置在MySQL_怎么在Django中安装与配置mysql
- 企业级系统应用,高级组合查询示例讲解 - Jeecg实战
- 习题3.9 堆栈操作合法性 (20分)
- SLIC超像素分割算法
- 编程c语言中文图形代码,C语言图形编程代码
- 入门Struts1第一讲——Struts1入门就这么简单
- VOCALOID笔记
- 关于IllegalArgumentException occurred while calling setter for property
- 树莓派控制超声波测距原理及实现
- 他是世界上最杰出程序员之一,1 个月写了个操作系统,退休后去做飞行员!...