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