- ~
題目描述
對全部員工的當前(to_date='9999-01-01')薪水按照salary進行按照1-N的排名,相同salary並列且按照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
));數據庫
本題的主要思想是複用salaries表進行比較排名,具體思路以下: 一、從兩張相同的salaries表(分別爲s1與s2)進行對比分析,先將兩表限定條件設爲to_date = '9999-01-01',挑選出當前全部員工的薪水狀況。 二、本題的精髓在於 s1.salary <= s2.salary,意思是在輸出s1.salary的狀況下,有多少個s2.salary大於等於s1.salary,好比當s1.salary=94409時,有3個s2.salary(分別爲94692,94409,94409)大於等於它,但因爲94409重複,利用COUNT(DISTINCT s2.salary)去重可得工資爲94409的rank等於2。其他排名以此類推。 三、千萬不要忘了GROUP BY s1.emp_no,不然輸出的記錄只有一條(多是第一條或者最後一條,根據不一樣的數據庫而定),由於用了合計函數COUNT() 四、最後先以 s1.salary 逆序排列,再以 s1.emp_no 順序排列輸出結果 SELECT s1.emp_no, s1.salary, COUNT(DISTINCT s2.salary) AS rank FROM salaries AS s1, salaries AS s2 WHERE s1.to_date = '9999-01-01' AND s2.to_date = '9999-01-01' AND s1.salary <= s2.salary GROUP BY s1.emp_no ORDER BY s1.salary DESC, s1.emp_no ASC 最後在支持ROW_NUMBER、RANK、DENSE_RANK等函數的SQL Server數據庫中,有如下參考代碼,惋惜在本題的SQLite數據庫中不支持。 SELECT emp_no, salaries, DENSE_RANK() OVER(ORDER BY salary DESC) AS rank WHERE to_date = '9999-01-01' ORDER BY salary DESC, emp_no ASC