首页 > 试题广场 >

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

[编程题]获取当前薪水第二多的员工的emp_no以及其对应的薪水sal
  • 热度指数:534941 时间限制: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
select
    sa.emp_no,
    sa.salary,
    em.last_name,
    em.first_name
from
    salaries sa
    join employees em on em.emp_no = sa.emp_no
where
    salary = (
        select
            max(salary)
        from
            salaries
        where
            salary < (
                select
                    max(salary)
                from
                    salaries
            )
    )
发表于 2025-06-17 21:03:40 回复(0)
select
    e.emp_no,
    salary,
    last_name,
    first_name
from employees e
join salaries s on e.emp_no = s.emp_no
where salary =
(select
    max(salary)
from
    salaries s
where
    salary < (
        select
            max(salary)
        from
            salaries s
    ))

发表于 2025-04-22 22:46:28 回复(0)
select e.emp_no, s.salary, e.last_name, e.first_name
from employees e inner join salaries s on e.emp_no=s.emp_no
where s.salary=(select max(salary)
from salaries
where salary < (select max(salary) from salaries))

发表于 2025-04-03 21:24:33 回复(0)
with
    k as (
        select
            emp_no,
            salary
        from
            salaries
        where
            salary not in (
                select
                    max(salary)
                from
                    salaries
            )
    ),
    k1 as (
        select
            max(salary) bb
        from
            k
    ),
    k2 as (
        select
            emp_no,
            salary
        from
            k1
            inner join salaries c on k1.bb = c.salary
    )
select
    k2.emp_no,
    salary,
    last_name,
    first_name
from
    k2
    left join employees d on d.emp_no = k2.emp_no

发表于 2025-04-01 11:43:14 回复(0)
with t1 as(
    select * 
    from employees
    left outer join salaries using(emp_no)
)

select emp_no, salary, last_name,first_name
from t1
where salary = (
select max(a.salary) as secSalary
from t1 as a
inner join t1 as b on a.salary < b.salary
)

发表于 2025-03-05 22:28:18 回复(0)
select e.emp_no
,salary
,last_name
,first_name
from salaries s
inner join 
(
select max(salary) ms from salaries 
where emp_no not in
(select emp_no from salaries 
where salary=(select max(salary) from salaries)
)
) zi
on s.salary=zi.ms
inner join employees e
on s.emp_no=e.emp_no

发表于 2025-02-08 11:30:06 回复(0)
先找最大的,再排除前面最大的,再找最大的  => 第二大的
select max(salary) from salaries
where salary <> (select max(salary) from salaries)


发表于 2025-01-29 17:31:50 回复(0)
select emp_no, salary, last_name, first_name
from (select *
from employees
join salaries using(emp_no)
where salary != (select max(salary) from salaries)) df
where salary = (select max(salary)
from (select *
from employees
join salaries using(emp_no)
where salary != (select max(salary) from salaries)) se   
)
拉了一坨大的,想法是先找到最大,然后用子查询找除了工资最高的全部数据,然后再用子查询找到第二高的工资,令工资等于去除最高工资后的最高工资
发表于 2024-12-26 17:13:26 回复(0)
select e.emp_no,s.salary,e.last_name,e.first_name from employees e
inner join salaries s
on s.emp_no = e.emp_no
where s.to_date = "9999-01-01"
and s.salary = (select max(salary) from salaries as a
where a.salary != (select max(salary) from salaries)) -- ez没难度
发表于 2024-12-24 22:50:06 回复(0)
select e.emp_no,salary,last_name,first_name
from employees e inner join salaries s on e.emp_no=s.emp_no
where salary =
(
    select max(salary) from (
                        select distinct salary from salaries
                        where salary != (select max(salary) from salaries)
                        ) a
   
)
发表于 2024-12-09 01:10:52 回复(0)
select
    em.emp_no,
    sa.salary,
    em.last_name,
    em.first_name
from
    employees as em
    left join salaries as sa on em.emp_no = sa.emp_no
where
    sa.salary = (
        select
            max(salary)
        from
            salaries
        where
            not salary = (select MAX(salary) from salaries)
    )

发表于 2024-10-27 14:39:18 回复(0)
with a as(
select
e.emp_no,
s.salary,
e.last_name,
e.first_name
from employees e
left join salaries s
on e.emp_no = s.emp_no
where s.salary !=
(select max(salary) from salaries))
select
a.emp_no,
a.salary,
a.last_name,
a.first_name
from a
where a.salary =
(select max(a.salary) from a)
发表于 2024-09-30 08:43:17 回复(0)
先找到第一的薪水记录
再从小于第一的薪水记录中找最大值,即第二的薪水记录
select
e.emp_no, s.salary, e.last_name, e.first_name
from employees e join salaries s
on e.emp_no = s.emp_no
where s.salary in(
    select MAX(s.salary)
    from employees e join salaries s
    on e.emp_no = s.emp_no
    where s.salary < (
        select MAX(s.salary)
         from employees e join salaries s
         on e.emp_no = s.emp_no
    )
);

发表于 2024-09-27 11:59:18 回复(0)
select s.emp_no,s.salary,e.last_name,e.first_name
from employees as e,salaries as s
where e.emp_no = s.emp_no and to_date='9999-01-01' and
salary =
(select  max(salary)
from salaries
where salary <> (select  max(salary)
                from salaries
                where to_date='9999-01-01')
                and to_date='9999-01-01');
发表于 2024-09-07 16:38:34 回复(0)
select t.emp_no, t.salary, t.last_name, t.first_name
from (    
        select e.emp_no, s.salary, e.last_name, e.first_name,
        rank()over( order by s.salary desc ) posn
        from employees e
        join salaries s on e.emp_no = s.emp_no
     ) as t
where t.posn=2;
发表于 2024-09-03 22:39:27 回复(0)
select e.emp_no,s.salary,e.last_name,e.first_name
from employees e
inner join salaries s on e.emp_no=s.emp_no
--找到薪水排名第二的薪水(第二名:小于最大值的数据里的最大值)
where s.salary = (
    select max(salary) from salaries 
    where salary < (select max(salary) from salaries)
)

发表于 2024-09-03 17:26:55 回复(0)
sql新人求大神解答,为什么这类题型有的解法一定要where to_date='9999-01-01'?
发表于 2024-08-22 09:01:06 回复(0)
with t1 as (
    select max(salary) from salaries
), # 求最高薪水
t2 as (
    select max(salary) from salaries where salary<(select * from t1)
) # 求第二高薪水
select b.emp_no,b.salary,a.last_name,a.first_name from employees a join salaries b on a.emp_no=b.emp_no and b.salary = (select * from t2)

发表于 2024-08-14 14:25:55 回复(0)
#分享个无限套娃版,给自己整笑了
select employees.emp_no, salaries.salary, employees.last_name, employees.first_name
from employees, salaries
where employees.emp_no = salaries.emp_no and salaries.salary =
(select max(a.salary)from
(select em.emp_no noo, salary, last_name, first_name from employees em left join salaries sa on em.emp_no = sa.emp_no
where salary not in (select max(salary) from salaries)) a)


发表于 2024-08-09 11:34:11 回复(0)