SQL27 给出每个员工每年薪水涨幅超过5000的员工编号

本文最后更新于:2022年4月9日 中午


题目描述

给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。

提示:在sqlite中获取datetime时间对应的年份函数为strftime(‘%Y’, to_date)

(数据保证每个员工的每条薪水记录to_date-from_date=1年,而且同一员工的下一条薪水记录from_data=上一条薪水记录的to_data)

1
2
3
4
5
6
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`));

如插入:

1
2
3
4
5
6
7
INSERT INTO salaries VALUES(10001,52117,'1986-06-26','1987-06-26');
INSERT INTO salaries VALUES(10001,62102,'1987-06-26','1988-06-25');
INSERT INTO salaries VALUES(10002,72527,'1996-08-03','1997-08-03');
INSERT INTO salaries VALUES(10002,72527,'1997-08-03','1998-08-03');
INSERT INTO salaries VALUES(10002,72527,'1998-08-03','1999-08-03');
INSERT INTO salaries VALUES(10003,43616,'1996-12-02','1997-12-02');
INSERT INTO salaries VALUES(10003,43466,'1997-12-02','1998-12-02');

输入描述

输出描述

emp_no from_date salary_growth
10001 1987-06-26 9985

题解

1
2
3
4
select s1.emp_no, s1.from_date, s1.salary-s2.salary as salary_growth from salaries as s1
join salaries as s2 on s1.emp_no=s2.emp_no
and s1.from_date=s2.to_date and s1.salary-s2.salary > 5000
order by salary_growth desc;

备注:

  1. 表的自连接,连接条件s1.emp_no=s2.emp_no保证是同一个员工,条件s1.from_date=s2.to_date保证获取相邻两年的薪水情况。