题目描述
查找所有员工自入职以来的薪水涨幅情况,给出员工编号emp_no以及其对应的薪水涨幅growth,并按照growth进行升序
(注:可能有employees表和salaries表里存在记录的员工,有对应的员工编号和涨薪记录,但是已经离职了,离职的员工salaries表的最新的to_date!='9999-01-01',这样的数据不显示在查找结果里面)
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
));
select s1.emp_no, (s1.salary-s2.salary) as growth
from (select emp_no,salary from salaries where to_date = '9999-01-01') as s1
INNER JOIN
(select s.emp_no,s.salary from salaries s INNER JOIN employees e on e.emp_no = s.emp_no and s.from_date = e.hire_date) as s2
on s1.emp_no = s2.emp_no
order by growth
窗口函数
1、RANK()
在计算排序时,若存在相同位次,会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,4······
2、DENSE_RANK()
这就是题目中所用到的函数,在计算排序时,若存在相同位次,不会跳过之后的位次。
例如,有3条排在第1位时,排序为:1,1,1,2······
3、ROW_NUMBER()
这个函数赋予唯一的连续位次。
例如,有3条排在第1位时,排序为:1,2,3,4······
select emp_no,salary,DENSE_RANK() over(order by salary DESC) from salaries where to_date='9999-01-01';