題目描述
查找所有員工自入職以來的薪水漲幅情況透揣,給出員工編號emp_no以及其對應(yīng)的薪水漲幅growth因宇,并按照growth進行升序
(注:可能有employees表和salaries表里存在記錄的員工丹莲,有對應(yīng)的員工編號和漲薪記錄珊随,但是已經(jīng)離職了喊熟,離職的員工salaries表的最新的to_date!='9999-01-01'困介,這樣的數(shù)據(jù)不顯示在查找結(jié)果里面)
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, -- '一條薪水記錄結(jié)束時間'
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
窗口函數(shù)
1、RANK()
在計算排序時铃诬,若存在相同位次祭陷,會跳過之后的位次。
例如趣席,有3條排在第1位時兵志,排序為:1,1宣肚,1想罕,4······
2、DENSE_RANK()
這就是題目中所用到的函數(shù)霉涨,在計算排序時按价,若存在相同位次,不會跳過之后的位次笙瑟。
例如楼镐,有3條排在第1位時,排序為:1逮走,1鸠蚪,1,2······
3师溅、ROW_NUMBER()
這個函數(shù)賦予唯一的連續(xù)位次茅信。
例如,有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';