首页 > 试题广场 >

获取当前薪水第二多的员工的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
select e.emp_no,salary,last_name,first_name
from employees e
left join salaries s on e.emp_no = s.emp_no
where salary  = (
    select max(salary)
    from (
        select salary
        from salaries
        where salary != (
            select max(salary)
            from salaries
        )
    ) as t
)
以一种很猥琐的方式做出来了
发表于 2024-04-26 10:01:35 回复(0)
SELECT 
    e.emp_no,
    s1.salary,
    e.last_name,
    e.first_name
FROM salaries s1
JOIN employees e USING(emp_no)
WHERE s1.salary = (
        SELECT max(s2.salary)
        FROM salaries s2 
        WHERE s2.salary NOT IN (
            SELECT max(salary)
            FROM salaries
    )
);
OR:
SELECT 
    e.emp_no,
    s1.salary,
    e.last_name,
    e.first_name
FROM salaries s1
JOIN employees e USING(emp_no)
WHERE s1.salary = (
        SELECT max(s2.salary)
        FROM salaries s2 
        WHERE s2.salary < ANY (
            SELECT max(salary)
            FROM salaries
    )
);


编辑于 2024-03-26 13:03:12 回复(0)
with t as (
select t1.emp_no,t2.salary,t1.last_name,t1.first_name
from employees as t1
inner join salaries as t2
on t1.emp_no = t2.emp_no
)

#查找不是最大值的最大值,即为第二大值
select emp_no,salary,last_name,first_name from t
where salary = (select max(salary) from t where salary != (select max(salary) from t)) ;

发表于 2024-03-09 12:58:50 回复(0)
SELECT
    e.emp_no,
    s1.max_salary,
    e.last_name,
    e.first_name
FROM
    employees e
    LEFT JOIN (
        SELECT
            emp_no,
            MAX(salary) as max_salary
        FROM
            salaries
        WHERE
            salary < (
                SELECT
                    MAX(salary)
                FROM
                    salaries
            )
    ) s1 ON s1.emp_no = e.emp_no
WHERE
    e.emp_no = s1.emp_no;
有没有大佬帮忙看下,我感觉我这个sql没问题啊,为什么执行错误。
编辑于 2024-03-07 17:12:00 回复(1)
with t1 as(
select 
es.emp_no 
,ss.salary
,es.last_name
,es.first_name
from employees es left join salaries ss 
on es.emp_no  = ss.emp_no )
,t2 as(
SELECT * from t1 where salary <> (SELECT max(salary) from t1 ))
SELECT * from t2 where salary = (SELECT max(salary) from t2 )
写的比较随意,但是思路简单,首先是使用MAX函数找到最高工资的那个人,返回反选出去not in或者<>,然后在剩下的3个人当中再选一个最大值,就是工资第二高的人
编辑于 2024-03-03 22:16:32 回复(0)
SELECT
    e.emp_no,
    s.salary,
    e.last_name,
    e.first_name
FROM
    employees e,
    salaries s
WHERE
    e.emp_no = s.emp_no
    AND s.salary = (
        SELECT
            MAX(salary)
        FROM
            salaries
        WHERE
            to_date = '9999-01-01'
            AND salary < (
                SELECT
                    MAX(distinct salary)
                FROM
                    salaries
            )
    )
这个是真的没问题了吧
发表于 2024-01-26 15:07:54 回复(1)
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 s1.salary
from salaries s1
left join salaries s2 on s1.salary<s2.salary
group by s1.salary
having count(s2.salary)=1)
发表于 2024-01-18 15:51:16 回复(0)
SELECT emp_no, salary, last_name, first_name
FROM (SELECT e.emp_no,
s.salary,
e.last_name,
e.first_name,
(SELECT COUNT(DISTINCT s2.salary) + 1
FROM salaries s2
WHERE s2.salary > s.salary) AS salary_rank
FROM employees e
JOIN salaries s ON e.emp_no = s.emp_no) ranked_salaries
WHERE salary_rank = 2;
编辑于 2023-12-28 14:32:51 回复(0)
select
    a.emp_no,
    sa.salary,
    a.last_name,
    a.first_name
from
    employees a
    right join (
        select
            *
        from
            salaries
        where
            salary = (
                select
                    max(salary)
                from
                    salaries
                where
                    salary < (
                        select
                            max(salary)
                        from
                            salaries ts
                    )
            )
    ) sa on a.emp_no = sa.emp_no;


编辑于 2023-12-12 15:50:21 回复(0)
with
    tmp as(
        select e.emp_no
            ,salary
            ,last_name
            ,first_name
        from employees e
        join salaries s
        using(emp_no)
        where salary < (select max(salary) from salaries)
    )
select *
from tmp
where salary = (select max(salary) from tmp)

发表于 2023-11-30 15:05:19 回复(0)

select emp_no,
       salary,
       last_name,
       first_name
from (select e.emp_no,
             e.first_name,
             e.last_name,
             s.salary
      from employees e,
           salaries s
      where e.emp_no = s.emp_no) es_temp
where emp_no = (select emp_no
                from salaries
                where salary = (select max(salary)
                                from salaries
                                where emp_no not in (select emp_no
                                                     from salaries
                                                     where salary = (select max(salary)
                                                                     from salaries))));

发表于 2023-11-22 16:36:25 回复(0)
我想知道为啥我这个不行,谢谢大佬们
select s.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 =
     (select salary
        from salaries
        group by salary
        order by salary desc
        limit 1,1
     );

发表于 2023-11-16 17:14:04 回复(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 between (
        select
            max(s.salary)
        from
            salaries
    ) and (
        select
            min(s.salary)
        from
            salaries
    )
limit
    3, 1
发表于 2023-11-15 20:55:29 回复(0)
select e.emp_no, salary,last_name,first_name from employees e left join salaries s on e.emp_no=s.emp_no                 ------------链接表格安排好表头
where salary=                         
(select max(salary) from salaries  where salary not in                                                                                              -----------第一层子查询 剔除最高工资的信息筛选出第二多工资 
(select max(salary) from salaries  where to_date='9999-01-01' )                                                                    -----------第二层子查询 筛选出最多的工资                                                  
and to_date='9999-01-01' ) and to_date='9999-01-01'
发表于 2023-10-20 15:59:32 回复(0)