首页 > 试题广场 >

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

[编程题]获取当前薪水第二多的员工的emp_no以及其对应的薪水sal
  • 热度指数:501862 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
有一个员工表employees简况如下:
emp_no 
birth_date 
first_name 
last_name 
gender hire_date 
10001
1953-09-02
Georgi     
Facello   
 M 1986-06-26
10002
1964-06-02
Bezalel    
Simmel    
 F 1985-11-21
10003  
1959-12-03
Parto      
Bamford   
 M 1986-08-28
10004  
1954-05-01
Chirstian  
Koblick   
 M 1986-12-01


有一个薪水表salaries简况如下:
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

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

示例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
头像 Anjhon_
发表于 2020-05-03 23:46:57
评论区里的答案详解: -- 方法一 select s.emp_no, s.salary, e.last_name, e.first_name from salaries s join employees e on s.emp_no = e.emp_no where s.salary = 展开全文
头像 东京不太冷
发表于 2020-10-15 18:02:06
题解: select e.emp_no emp_no, s.salary salary, e.last_name last_name, e.first_name first_name from employees e inner join salaries s on e.emp_no = s.emp 展开全文
头像 竹201912121059102
发表于 2020-04-13 15:53:19
select e.emp_no,max(s.salary),e.last_name,e.first_name from employees as e inner join salaries as s on&nb 展开全文
头像 N刻后告诉你
发表于 2020-05-19 20:33:35
题目:获查找当前薪水(to_date=‘9999-01-01’)排名第二多的员工编号emp_no、薪水salary、last_name以及first_name,不准使用order by解题关键:要求的是薪水排名第二多的,所以关键是找到第二多的薪水对应的salary值1.可以通过MAX配合<运算 展开全文
头像 GangDong
发表于 2021-04-15 15:52:43
如何理解自连接查询? select s.emp_no, s.salary, e.last_name, e.first_name from salaries s join employees e on s.emp_no = e.emp_no where s.salary = ( sel 展开全文
头像 牛客348593420号
发表于 2020-12-21 12:33:45
题目要求在不使用order by语句的情况下输出(to_date='9999-01-01')时salary第二大的员工信息,除了大多数回答采用的max()方法,我在这里提供另一种思路,即使用窗口函数dense_rank:首先介绍一下窗口函数的用法。有三种排序的窗口函数:1)RANK() 在计算 展开全文
头像 horsemuzi
发表于 2020-10-11 12:32:41
薪水第二多的员工可能有多个,所以要重点确定第二多的薪水salary的值 利用子查询:获取salary值第二大的值🤣 -- 工资第二多的员工可能有多个 SELECT    e.emp_no,   s.salary,   e.last_na 展开全文
头像 悦悦张
发表于 2020-04-17 17:44:12
感觉我的想法和讨论里的不太一样,不过大同小异哈~ 1、首先创建子查询,该子查询中包含emp_no,salary,cnt字段,其中cnt为表salaries与自己比较,薪水小于自己的不重复个数(count(distinct s2.salary)); 2、用内连接将employees与子查询连接起来,w 展开全文
头像 高质量搬砖人
发表于 2021-01-29 16:10:26
方法)dense_rank()over() 不使用order by 当前薪水(to_date='9999-01-01') SELECT e.emp_no, a.salary, e.last_name, e.first_name FROM employees AS e JOIN ( SE 展开全文
头像 zzuli_huahua
发表于 2021-08-05 14:23:22
1、想要找到薪水第二多的员工,那么可以使用order by语句就很简单了,可是题目偏偏不给用order by语句,你说气不气人?不过题目有张良计,咱有过墙梯呀。可以通过子查询或者链接查询获取到薪水排名第二的员工, 我这里给大家演示了连接查询方法 2、首先查询列表SELECT s.emp_no,sal 展开全文