该文章主要记录在学习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以及其对应的薪水相关推荐

  1. 《数据库SQL实战》获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary

    题目描述 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary CREATE TABLE salaries ( emp_no int(11) ...

  2. [SQL实战]之获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

    题目描述 获取当前(to_date='9999-01-01')薪水第二多的员工的emp_no以及其对应的薪水salary CREATE TABLE salaries ( emp_no int(11) ...

  3. SQL18 获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

    原题连接: https://www.nowcoder.com/practice/c1472daba75d4635b7f8540b837cc719?tpId=82&&tqId=29770 ...

  4. 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 ...

  5. [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 ...

  6. 查找薪水第二多的员工基本信息

    题目描述查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,不准 使用 order by CREAT ...

  7. 此处不允许使用分组函数_查找当前薪水排名第二多的员工信息(不使用order by和窗口函数)...

    题目描述 查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no.薪水salary.last_name以及first_name,你可以不使用order by完成吗 C ...

  8. 数据库SQL实战11_获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date=‘9999-01-01‘, 结果第一列给出员工的emp_no, 第二列给出其manager

    题目 获取员工其当前的薪水比其manager当前薪水还高的相关信息,当前表示to_date='9999-01-01', 结果第一列给出员工的emp_no, 第二列给出其manager的manager_ ...

  9. 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 ...

最新文章

  1. Django搭建个人博客:渲染Markdown文章目录
  2. javaweb项目中的过滤器的使用
  3. JQuery图片无限循环滚动源码
  4. 牛客国庆集训派对Day2 F、平衡二叉树 【构造+记忆化搜索】
  5. 如何控制并发和控制死锁(内含pb的处理要点)
  6. 读书笔记-JavaScript高级程序设计(1)
  7. apt-get无法下载,一些网址Not Found 404
  8. php 验证微信token_php之微信公众号验证token获取access_token
  9. mysql存储引擎中INNODB和MyISAM的区别
  10. 开发物体识别桌、_【课程总结】AR系统开发“秘籍”大揭秘!
  11. django配置在MySQL_怎么在Django中安装与配置mysql
  12. 企业级系统应用,高级组合查询示例讲解 - Jeecg实战
  13. 习题3.9 堆栈操作合法性 (20分)
  14. SLIC超像素分割算法
  15. 编程c语言中文图形代码,C语言图形编程代码
  16. 入门Struts1第一讲——Struts1入门就这么简单
  17. VOCALOID笔记
  18. 关于IllegalArgumentException occurred while calling setter for property
  19. 树莓派控制超声波测距原理及实现
  20. 他是世界上最杰出程序员之一,1 个月写了个操作系统,退休后去做飞行员!...

热门文章

  1. 最详细的Python安装教程
  2. 监控swagger 接口变动
  3. 手把手教你用自己训练的AI模型玩王者荣耀
  4. 香港海关去年执法案件逾2.2万宗 2万人被捕
  5. 一、C++简介以及qt安装及配置(华清笔记)
  6. UEFI启动U盘制作
  7. android自定义控件的惯性滑动
  8. javascript描述符descriptor详解
  9. python判别分析_python中的线性判别分析
  10. 什么是PSE认证,菱形和圆形的区别是什么