牛客網sql6解析--查詢所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序
阿新 • • 發佈:2021-01-25
技術標籤:力扣資料庫題
題目:查詢所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序(請注意,一個員工可能有多次漲薪的情況)
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
));
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
));分析:題目的最主要目的就是查出員工入職的時候的薪水情況,問題在哪呢,問題在於一個員工會有多次漲薪的情況。我們畫出這兩張表,比較下
employees表
emp_no | birth_date | first_name | last_name | gender | hire_date |
---|---|---|---|---|---|
001 | 9999-09-09 | big | dog | 1 | 1998-01-10 |
…… | …… | …… | …… | …… | …… |
我們思考下這張表的情況,這張表的emp_no應該是沒有重複的,因為上面這些資訊都不會重複,這幾個欄位沒有重複的意義。
salaries表
emp_no | salary | from_date | to_date |
---|---|---|---|
001 | 2000 | 1998-01-10 | 1998-12-31 |
001 | 5000 | 1998-12-31 | 1999-07-31 |
002 | 1000 | 1996-12-31 | 1997-07-31 |
…… | …… | …… | …… |
這張salaries會展現出漲薪的情況,就是這個人在from_date到to_date這段時間的salary是多少,所以如果我們需要找出這個人的入職時間,其實就是找出他的最小入職時間,sql語句應該是
select min(from_date) ,salary,emp_no from salaries group by emp_no
這樣我們會形成一個表,這個表顯示的就是salaries表的每個人的入職的時候的工資。不包含他漲薪的情況。我們拿到這樣一張表後,使用employees表進行左連線就行了。注意,在這個新表中是沒有hire_date的,第一次入職的from_date就是hire_date。
答案如下:
select e.emp_no,new_s.salary from employees e
left join (select min(from_date),salary,emp_no from salaries group by emp_no) new_s on
e.emp_no = new_s.emp_no order by e.emp_no desc;
結果為:
後記:這個題提交了27次才通過,我自己都無語,給我的感覺就是一定要畫出表,然後對錶進行分析,不然空想很容易想錯。