【362天】我愛刷題系列121(2018.02.02)

叨叨兩句

  1. ~

SQL習題016

1

題目描述
對全部員工的當前(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
相關文章
相關標籤/搜索