首页 > 试题广场 >

查找在职员工自入职以来的薪水涨幅情况

[编程题]查找在职员工自入职以来的薪水涨幅情况
  • 热度指数:594169 时间限制: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 2001-06-22
10002
1964-06-02
Bezalel    
Simmel    
 F 1999-08-03

有一个薪水表salaries简况如下:
emp_no 
salary
from_date 
to_date
10001
85097 2001-06-22
2002-06-22
10001 88958
2002-06-22 9999-01-01
10002
72527 1999-08-03
2000-08-02
10002
72527 2000-08-02 2001-08-02

请你查找在职员工自入职以来的薪水涨幅情况(注意这里强调的是在职员工),给出在职员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序,以上例子输出为
(注: to_date为薪资调整某个结束日期,或者为离职日期,to_date='9999-01-01'时,表示依然在职,无后续调整记录)
emp_no growth
10001 3861
示例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','2001-06-22');
INSERT INTO employees VALUES(10002,'1964-06-02','Bezalel','Simmel','F','1999-08-03');
INSERT INTO salaries VALUES(10001,85097,'2001-06-22','2002-06-22');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');
INSERT INTO salaries VALUES(10002,72527,'1999-08-03','2000-08-02');
INSERT INTO salaries VALUES(10002,72527,'2000-08-02','2001-08-02');

输出

emp_no|growth
10001|3861
WITH
temp1 AS(
SELECT emp_no, salary
FROM salaries
WHERE to_date = '9999-01-01'
),
temp2 AS(
SELECT e.emp_no, salary
FROM employees e
JOIN salaries s ON e.hire_date = s.from_date AND e.emp_no = s.emp_no
)

SELECT
t2.emp_no,
t1.salary - t2.salary AS growth
FROM temp2 t2
JOIN temp1 t1 USING (emp_no)
ORDER BY growth
发表于 2025-10-31 16:13:36 回复(0)
select e.emp_no,(sum(case when s.to_date='9999-01-01' then salary else 0 end)-sum(case when s.from_date=e.hire_date then salary else 0 end)) as growth
from employees e
left join salaries s  on e.emp_no=s.emp_no
where e.emp_no in (select emp_no
from salaries
where to_date='9999-01-01')
group by e.emp_no
order by (sum(case when s.to_date='9999-01-01' then salary else 0 end)-sum(case when s.from_date=e.hire_date then salary else 0 end))

发表于 2025-10-28 16:32:45 回复(0)
做了十几分钟算是通过了。D老师给的锐评如图:

代码如下:
select 
a.emp_no,
(a.salary - b.salary) as growth
from
(select salaries.emp_no,salary
from
salaries
where 
to_date = '9999-01-01') as a
left join
(select rk.emp_no,salary
from
(select 
salaries.emp_no,
salary,
rank() over(partition by emp_no order by from_date)as posn
from
salaries) as rk
where posn = 1) as b
on
a.emp_no = b.emp_no
order by growth

发表于 2025-10-23 14:09:04 回复(0)
with t1 as (select emp_no
from
(select
emp_no
,to_date
,row_number() over(partition by emp_no order by to_date desc) as rk
from salaries) e 
where rk=1 and to_date="9999-01-01")
select 
distinct 
emp_no
,(first_value(salary) over(partition by emp_no order by to_date desc))
-(first_value(salary) over(partition by emp_no order by to_date)) as 
growth 
from salaries 
where emp_no in (select * from t1)
order by 2

发表于 2025-10-15 11:44:13 回复(0)
select 
    s.emp_no,
    max(s.salary)-min(s.salary) growth
from salaries s
inner join(
    select emp_no
    from salaries
    where to_date='9999-01-01'
)r on r.emp_no=s.emp_no
group by emp_no
order by growth asc;

发表于 2025-09-29 15:17:42 回复(0)
with t1
as (
select *
from salaries as s
where to_date = '9999-01-01'
)

select
e.emp_no,
t1.salary - s.salary as growth
from employees as e
join salaries as s
on e.emp_no=s.emp_no and e.hire_date = s.from_date
join t1
on e.emp_no = t1.emp_no
order by growth asc
发表于 2025-08-18 21:02:12 回复(0)
SELECT
    b.emp_no,
    CASE
        WHEN MAX(b.salary) - MIN(b.salary) != 0 THEN MAX(b.salary) - MIN(b.salary)
        else 0
    END as growth
from
    employees a
    INNER join (
        SELECT
            emp_no,
            salary
        FROM
            salaries
        where
            emp_no in (
                SELECT distinct
                    emp_no
                from
                    salaries
                where
                    to_date = '9999-01-01'
            )
    ) b on a.emp_no = b.emp_no
group by
    b.emp_no
order by
    growth asc

只有这个数据有问题,看不到表数据,没从改起
发表于 2025-08-14 10:25:22 回复(0)
有没有佬看看这个为什么不对吗,想不明白
select
    a.emp_no,
    (
        max(b.salary) - (
            SELECT
                salary
            FROM
                salaries
            WHERE
                emp_no = a.emp_no
                AND from_date = a.hire_date
        )
    ) as growth
from
    employees a
    join salaries b on a.emp_no = b.emp_no
where
    a.emp_no in (
        select
            emp_no
        from
            salaries
        where
            to_date = '9999-01-01'
    )
group by
    a.emp_no
order by
    growth asc;
发表于 2025-08-04 21:31:02 回复(0)
SELECT a.emp_no, (Maxsalary-Minsalary) growth
FROM(
    SELECT emp_no, salary Maxsalary, to_date Maxdate
    FROM salaries
    WHERE to_date = '9999-01-01') a
LEFT JOIN(
    SELECT b.emp_no emp_no, salary Minsalary, hire_date Firstdate
    FROM employees b
    LEFT JOIN salaries c
    ON b.emp_no = c.emp_no AND hire_date = from_date 
    ) d
ON a.emp_no = d.emp_no

发表于 2025-07-25 15:42:11 回复(0)

这样为什么不对 

select
    a.emp_no,
    a.s2 - b.s1 growth
from
    (
        select
            emp_no,
            salary s2
        from
            salaries
        where
            to_date = '9999-01-01'
    ) a
    join (
        select
            emp_no,
            salary s1
        from
            salaries s
            join employees e on s.emp_no = e.emp_no
            and s.from_date = e.hire_date
    ) b on a.emp_no = b.emp_no
order by
    growth
发表于 2025-07-22 00:17:15 回复(0)
select
    emp_no,
    max(
        case
            when rk1 = 1 then salary
            else 0
        end
    ) - max(
        case
            when rk2 = 1 then salary
            else 0
        end
    ) growth
from
    (
        select
            t1.emp_no,
            t2.salary,
            from_date,
            to_date,
            rank() over (
                partition by
                    t1.emp_no
                order by
                    from_date desc
            ) rk1,
            rank() over (
                partition by
                    t1.emp_no
                order by
                    from_date asc
            ) rk2
        from
            employees t1
            join salaries t2 on t1.emp_no = t2.emp_no
    ) m1 
group by
    emp_no
having
    max(to_date) = '9999-01-01'
order by
    growth
比较复杂的办法,关键在于采用窗口函数对字段from_date进行正序和倒序两次排名,以此来确定最初与最终的薪资
发表于 2025-07-16 22:30:31 回复(0)
SELECT a.emp_no , sum(a.salary_1 - a.salary) as  growth
from (
    select emp_no , salary , 
    LEAD(salary,1) OVER (PARTITION BY emp_no ORDER BY from_date) as salary_1
    from salaries 
    where emp_no in (
        select emp_no from salaries where to_date = '9999-01-01'
    )
)a
group by a.emp_no
order by growth
发表于 2025-07-16 10:43:09 回复(0)
为什么第二个测试用例不让我查看 这让我怎么调试。。。。。
发表于 2025-07-11 15:52:40 回复(0)
select
    s.emp_no,
    growth
from
    salaries s
    join (
        select
            emp_no,
            max(salary) - min(salary) growth
        from
            salaries
        group by
            emp_no
    ) a on s.emp_no = a.emp_no
where
    to_date = '9999-01-01'
order by
    growth
怎么自测就过了,但是提交的时候10003就不对呢
发表于 2025-07-04 11:02:53 回复(0)
想问这么写还有什么漏洞吗,提交后是说通过的
select
    t1.emp_no,
    t1.salary - t2.salary as growth
from
    (
        select
            emp_no,
            salary,
            to_date
        from
            salaries
        where
            to_date = '9999-01-01'
    ) t1
    left join employees e on t1.emp_no = e.emp_no left join
    (
        select
            s1.emp_no,
            salary
        from
            salaries s1
            left join employees e1 on s1.emp_no = e1.emp_no
        where
            from_date = hire_date
    ) t2 on t1.emp_no=t2.emp_no
order by
    growth asc
发表于 2025-06-29 15:17:20 回复(0)
with
    finder as (
        select
            emp_no,
            hire_date
        from
            employees
        where
            emp_no in (
                select
                    emp_no
                from
                    salaries
                where
                    to_date = '9999-01-01'
            )
    ),
    c as (
        select
            finder.emp_no,
            salaries.salary
        from
            finder
            left join salaries on finder.emp_no = salaries.emp_no
        where
            salaries.from_date = finder.hire_date
    ),
    d as (
        select
            finder.emp_no,
            salaries.salary
        from
            finder
            left join salaries on finder.emp_no = salaries.emp_no
        where
            salaries.to_date = '9999-01-01'
    )
select
    c.emp_no,
    (d.salary - c.salary) as growth
from
    c
    inner join d on c.emp_no = d.emp_no
order by
    growth
找到还在职的员工、找到这些人起始工资和目前工资、相减
发表于 2025-06-28 11:02:22 回复(0)