首页 > 试题广场 >

计算薪资涨幅

[编程题]计算薪资涨幅
  • 热度指数:83 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

表: 雇员表

+------+--------------+
| 字段名称 | 类型           |
+------+--------------+
| 雇员编号 | int          |
| 出生日期 | date(255)    |
| 姓名   | varchar(512) |
| 性别   | varchar(512) |
| 雇用日期 | date(255)    |
+------+--------------+

雇员编号 是该表的主键。
该表的每一行表示 一名雇员的信息,包含编号、出生日期、姓名、性别和雇用日期。

表: 薪水表

+------+-----------+
| 字段名称 | 类型        |
+------+-----------+
| 雇员编号 | int       |
| 薪水   | int       |
| 起始日期 | date(255) |
| 结束日期 | date(255) |
+------+-----------+

雇员编号、起始日期、结束日期 是该表的主键。
该表的每一行表示 一名雇员的薪水信息,包含编号、起始日期和结束日期。

 

编写一个 SQL 查询,查找当前所有雇员入职以来的薪水涨幅,给出雇员编号以及其对应的薪水涨幅。其中,薪水表中结束日期为2004-01-01的才是当前员工,否则是已离职员工。

查询结果如下例所示。

 

示例 1:

输入: 表:雇员表
+-------+------------+----+----+------------+
| 雇员编号  | 出生日期       | 姓名 | 性别 | 雇用日期       |
+-------+------------+----+----+------------+
| 10002 | 1976-09-09 | 小明 | 男  | 2001-08-02 |
| 10005 | 1973-08-07 | 小红 | 女  | 2001-09-09 |
| 10006 | 1980-08-28 | 小兰 | 女  | 2001-08-02 |
+-------+------------+----+----+------------+

表:薪水表
+-------+-------+------------+------------+
| 雇员编号  | 薪水    | 起始日期       | 结束日期       |
+-------+-------+------------+------------+
| 10002 | 72527 | 2001-08-02 | 2003-01-01 |
| 10002 | 75432 | 2003-01-01 | 2004-01-01 |
| 10005 | 94692 | 2001-09-09 | 2003-01-01 |
| 10006 | 43311 | 2001-08-02 | 2004-01-01 |
+-------+-------+------------+------------+ 输出: +-------+------+
| 雇员编号  | 薪水涨幅 |
+-------+------+
| 10002 | 2905 |
| 10006 | 0    |
+-------+------+ 解释: 先计算出当前员工的“当前薪水”和“入职薪水”,再通过“雇员编号”进行表关联计算。
示例1

输入

CREATE TABLE `雇员表` 
(
    `雇员编号` INT,
    `出生日期` DATE,
    `姓名` VARCHAR(512),
    `性别` VARCHAR(512),
    `雇用日期` DATE
);
CREATE TABLE `薪水表` 
(
    `雇员编号` INT,
    `薪水` INT,
    `起始日期` DATE,
    `结束日期` DATE
);
-- 插入雇员表的数据
INSERT INTO `雇员表` (`雇员编号`, `出生日期`, `姓名`, `性别`, `雇用日期`) VALUES (10002, '1976-09-09', '小明', '男', '2001-08-02');
INSERT INTO `雇员表` (`雇员编号`, `出生日期`, `姓名`, `性别`, `雇用日期`) VALUES (10005, '1973-08-07', '小红', '女', '2001-09-09');
INSERT INTO `雇员表` (`雇员编号`, `出生日期`, `姓名`, `性别`, `雇用日期`) VALUES (10006, '1980-08-28', '小兰', '女', '2001-08-02');
-- 插入薪水表的数据
INSERT INTO `薪水表` (`雇员编号`, `薪水`, `起始日期`, `结束日期`) VALUES (10002, 72527, '2001-08-02', '2003-01-01');
INSERT INTO `薪水表` (`雇员编号`, `薪水`, `起始日期`, `结束日期`) VALUES (10002, 75432, '2003-01-01', '2004-01-01');
INSERT INTO `薪水表` (`雇员编号`, `薪水`, `起始日期`, `结束日期`) VALUES (10005, 94692, '2001-09-09', '2003-01-01');
INSERT INTO `薪水表` (`雇员编号`, `薪水`, `起始日期`, `结束日期`) VALUES (10006, 43311, '2001-08-02', '2004-01-01');

输出

雇员编号|薪水涨幅
10002|2905
10006|0
select 
雇员编号
,(当前薪水-入职薪水) as 薪水涨幅
from 
(select 
雇员编号
,结束日期
,first_value(薪水) over(partition by 雇员编号 order by 起始日期) as 入职薪水
,first_value(薪水) over(partition by 雇员编号 order by 起始日期 desc) as 当前薪水
from 雇员表 x 
join 薪水表 y 
using(雇员编号)) e
where 结束日期="2004-01-01"

发表于 2025-11-12 16:13:32 回复(0)