學習筆記 | SQL刷題 | 對所有員工的薪水按照salary進行按照1-N的排名 DENSE_RANK

題目描述

對所有員工的當前(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 <排序用列清單> )

*其中[ ]中的內容可以忽略

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章