1. 程式人生 > 其它 >牛客網sql6解析--查詢所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序

牛客網sql6解析--查詢所有員工入職時候的薪水情況,給出emp_no以及salary, 並按照emp_no進行逆序

技術標籤:力扣資料庫題

題目:查詢所有員工入職時候的薪水情況,給出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));

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));
分析:題目的最主要目的就是查出員工入職的時候的薪水情況,問題在哪呢,問題在於一個員工會有多次漲薪的情況。我們畫出這兩張表,比較下
employees表

emp_nobirth_datefirst_namelast_namegenderhire_date
0019999-09-09bigdog11998-01-10
………………………………

我們思考下這張表的情況,這張表的emp_no應該是沒有重複的,因為上面這些資訊都不會重複,這幾個欄位沒有重複的意義。
salaries表

emp_nosalaryfrom_dateto_date
00120001998-01-101998-12-31
00150001998-12-311999-07-31
00210001996-12-311997-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次才通過,我自己都無語,給我的感覺就是一定要畫出表,然後對錶進行分析,不然空想很容易想錯。