首页 > 试题广场 >

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

[编程题]查找在职员工自入职以来的薪水涨幅情况
  • 热度指数:611163 时间限制: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
t1 as(-- 第一次工资
select emp_no,salary,to_date
from salaries
where (emp_no,to_date) in (
    select emp_no,min(to_date)
    from salaries
    group by emp_no
    )
)
,t2 as(-- 最后一次工资
select emp_no,salary,to_date
from salaries
where (emp_no,to_date) in (
    select emp_no,max(to_date)
    from salaries
    group by emp_no
    )
)
select t1.emp_no,t2.salary-t1.salary as growth
from t1
left join t2
on t1.emp_no = t2.emp_no
where t1.emp_no in(
    select distinct emp_no
    from salaries
    where to_date = '9999-01-01'  
)
order by growth asc
 单表其实就可以算了
发表于 2026-04-10 17:13:12 回复(0)
我这个为啥子不得行?
with now_salaries as(
    select *
    from salaries
    where emp_no in(select emp_no from
    salaries
    where to_date='9999-01-01')
)
select
n1.emp_no,
n2.salary-n1.salary as growth
from now_salaries n1 join now_salaries n2 on n1.to_date=n2.from_date
group by n1.emp_no,growth
发表于 2026-03-26 15:07:53 回复(0)
select a.emp_no,max(a.salary)-min(a.salary) growth from
(select salaries.*,employees.hire_date from employees right join salaries on employees.emp_no = salaries.emp_no
where salaries.emp_no in
(
  select emp_no from salaries where to_date='9999-01-01'
)
) a
group by a.emp_no
发表于 2026-03-23 21:27:07 回复(0)
with
    a as (
        select
            emp_no,
            salary
        from
            salaries s
            join employees e using (emp_no)
        where
            s.from_date = e.hire_date
    ),
    b as (
        select
            emp_no,
            salary
        from
            salaries as s
            join employees as e using (emp_no)
        where
            date(s.to_date) = '9999-01-01'
    )
select
    emp_no,
    (b.salary - a.salary) as growth
from
    b
    join a using (emp_no)
order by
    2;

发表于 2026-03-21 15:28:33 回复(0)
select
    t.emp_no,
    (t.salary - t.salary1) as growth
from
    (select 
        s.emp_no,
        s.salary,
        lag(s.salary,1) over(partition by s.emp_no order by s.salary) salary1,
        s.to_date
    from salaries s
    left join employees e on e.hire_date  = s.from_date ) t
where t.to_date='9999-01-01'&nbs***bsp;t.salary1 != null
order by growth;
为啥通不过第二个用例
发表于 2026-03-18 11:59:26 回复(0)
我这样最大减最小运行出来有何不妥啊?
select emp_no,(s.salary2-s.salary1) as growth
from (
    select s1.emp_no,min(s1.salary) as salary1,max(s2.salary) as salary2
    from salaries s1
    join salaries s2
    on s1.emp_no=s2.emp_no
    and s2.to_date='9999-01-01'
    group by s1.emp_no
) as s
order by growth;

发表于 2026-03-09 16:04:43 回复(0)
只有我神奇的脑回路想到用lag???
select emp_no,growth from(select emp_no, (salary-lag(salary,1)over(partition by emp_no order by from_date  ))growth from
(select e.emp_no, salary,from_date from employees e left join salaries s on e.emp_no = s.emp_no
where from_date=hire_date or to_date = '9999-01-01') as new) as f
where growth is not null
order by growth

发表于 2026-02-15 18:09:43 回复(0)
WITH
    person AS (
        SELECT
            emp_no,
            hire_date
        FROM
            employees
        WHERE
            emp_no IN (
                SELECT
                    emp_no
                FROM
                    salaries
                WHERE
                    to_date = '9999-01-01'
            )
    ),
    data AS (
        SELECT
            P.emp_no,
            CASE
                WHEN P.hire_date = S.from_date THEN - salary
                WHEN S.to_date = '9999-01-01' THEN salary
                ELSE 0
            END as f_l_s
        FROM
            person P
            LEFT JOIN salaries S ON P.emp_no = S.emp_no
    )
SELECT
    emp_no,
    SUM(f_l_s) as growth
FROM
    data
GROUP BY
    emp_no
ORDER BY
    growth
笨是笨点,但好在是自己手搓的
发表于 2026-01-06 16:55:50 回复(0)
思路:先筛选出所有员工的最初薪资和在职员工目前的薪资,然后对员工进行分组,分组后使用
having max(to_date) = "9999-01-01"筛去离职的员工。
代码:
select employees.emp_no, max(salary) - min(salary) growth
from employees join salaries using(emp_no)
where to_date = "9999-01-01"&nbs***bsp;from_date = hire_date
group by employees.emp_no
having max(to_date) = "9999-01-01"
order by growth


发表于 2025-12-27 16:33:32 回复(0)
select t.emp_no emp_no
,(max(t.salary)-min(t.salary)) growth
from 
(
    select s.emp_no  emp_no 
    ,s.salary salary
    ,s.from_date from_date 
    ,s.to_date to_date
   , e.hire_date hire_date 
    from salaries s
left join employees e 
on e.emp_no  = s.emp_no and e.hire_date = s.from_date ) t
where (t.hire_date is not null)&nbs***bsp;(t.to_date = '9999-01-01')
group by t.emp_no 
having count(t.salary) = 2
order by growth

发表于 2025-12-10 22:19:37 回复(0)
select
    emp_no
    , max(salary) - min(salary) as growth
from
    (select
        emp_no
        , salary
        , row_number() over(partition by emp_no order by from_date) as rn1
        , row_number() over(partition by emp_no order by from_date desc) as rn2
    from salaries
    where emp_no in(
        select
            emp_no
        from salaries
        where to_date = '9999-01-01'
    )
) tmp
where rn1 = 1&nbs***bsp;rn2 = 1
group by emp_no
order by growth
对在职员工的薪资数据进行正反两个排名,再子查询筛选出来第一个薪资以及最后的薪资,然后用每个员工的最大薪资减去最小的薪资
发表于 2025-11-26 01:02:10 回复(0)
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)