題目描述
對所有員工的當前(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`));
select emp_no, salary,
dense_rank() over (order by salary desc) as rank
from salaries
where to_date='9999-01-01'
order by rank asc,emp_no asc;
- 這道題目考察的是 SQL窗口函數(OLAP函數) 中用於排序的專用窗口函數用法,但是由於關係數據庫提供支持OLAP用途功能時間不長,還有一部分DBMS不支持這個新功能(比如MYSQL)。
下面介紹三種用於進行排序的專用窗口函數:
1、RANK()
在計算排序時,若存在相同位次,會跳過之後的位次。
例如,有3條排在第1位時,排序爲:1,1,1,4······
2、DENSE_RANK()
這就是題目中所用到的函數,在計算排序時,若存在相同位次,不會跳過之後的位次。
例如,有3條排在第1位時,排序爲:1,1,1,2······
3、ROW_NUMBER()
這個函數賦予唯一的連續位次。
例如,有3條排在第1位時,排序爲:1,2,3,4······
窗口函數用法:
<窗口函數> OVER ( [PARTITION BY <列清單> ]
ORDER BY <排序用列清單> )
*其中[ ]中的內容可以忽略