sql-获取当前薪水第二多的员工的emp_no以及其对应的薪水salary

Posted hehell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql-获取当前薪水第二多的员工的emp_no以及其对应的薪水salary相关的知识,希望对你有一定的参考价值。

牛客上的sql题目 记录下

描述

有一个员工表employees简况如下:
 
 
有一个薪水表salaries简况如下:
 
请你查找薪水排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不能使用order by完成,以上例子输出为:
(温馨提示:sqlite通过的代码不一定能通过mysql,因为SQL语法规定,使用聚合函数时,select子句中一般只能存在以下三种元素:常数、聚合函数,group by 指定的列名。如果使用非group by的列名,sqlite的结果和mysql 可能不一样)

示例1

输入:
drop table if exists  `employees` ; 
drop table if exists  `salaries` ; 
CREATE TABLE `employees` (
`emp_no` int(11) NOT NULL,
`birth_date` date NOT NULL,
`first_name` varchar(14) NOT NULL,
`last_name` varchar(16) NOT NULL,
`gender` char(1) NOT NULL,
`hire_date` date NOT NULL,
PRIMARY KEY (`emp_no`));
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary` int(11) NOT NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
INSERT INTO employees VALUES(10001,\'1953-09-02\',\'Georgi\',\'Facello\',\'M\',\'1986-06-26\');
INSERT INTO employees VALUES(10002,\'1964-06-02\',\'Bezalel\',\'Simmel\',\'F\',\'1985-11-21\');
INSERT INTO employees VALUES(10003,\'1959-12-03\',\'Parto\',\'Bamford\',\'M\',\'1986-08-28\');
INSERT INTO employees VALUES(10004,\'1954-05-01\',\'Chirstian\',\'Koblick\',\'M\',\'1986-12-01\');
INSERT INTO salaries VALUES(10001,88958,\'2002-06-22\',\'9999-01-01\');
INSERT INTO salaries VALUES(10002,72527,\'2001-08-02\',\'9999-01-01\');
INSERT INTO salaries VALUES(10003,43311,\'2001-12-01\',\'9999-01-01\');
INSERT INTO salaries VALUES(10004,74057,\'2001-11-27\',\'9999-01-01\');
输出:
10004|74057|Koblick|Chirstian

思路:

第一种方法:很显然,求第二名就是除去第一名后的第一名,通过子查询查出第一名并将其排除即可

主要理解第二种方法:使用多表连接,将第一名排除,并选中第二名(不限于第二名)

1.多表连接进行统计比自身大的有多少个

2.由上表可显然得出,名次就是大于他自身的数量,加上having进行筛选

3.完整代码

SELECT
	e.emp_no,
	salary,
	last_name,
	first_name 
FROM
	employees e
	JOIN salaries s ON e.emp_no = s.emp_no 
WHERE
	s.salary =(
	SELECT
		s1.salary 
	FROM
		salaries s1
		JOIN salaries s2 ON s1.salary <= s2.salary 
	GROUP BY
		s1.salary 
	HAVING
	count( DISTINCT s2.salary ) = 2 
	)

 

 

 

以上是关于sql-获取当前薪水第二多的员工的emp_no以及其对应的薪水salary的主要内容,如果未能解决你的问题,请参考以下文章

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

*18查找当前薪水排名第二多的员工编号emp_no薪水salarylast_name以及first_name,不准使用order by

查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no薪水salarylast_name以及first_name,不准使用order by

查找当前薪水(to_date='9999-01-01')排名第二多的员工编号emp_no薪水salarylast_name以及first_name,不准使用order by

牛客题霸-SQL篇——10~20题

sql不用order by查找第二的思路