对比rank, dense_rank, row_number
1、一道題惹得禍
letcode——185. 部門工資前三高的所有員工,經典TOPN問題!
2、對比 rank, dense_rank, row_number
【題目】
“成績表”記錄了學生的學號,學生選修的課程,以及對應課程的成績。
為了對學生成績進行考核,現需要查詢每門課程的前3高成績。
注意:如果出現并列第一的情況,則同為第一名。
【解題思路】
題目要求找出每個課程獲得前三高成績的所有學生。難點在于每個課程前3高成績。
前3高的成績意味著要對成績排名。
專用窗口函數rank, dense_rank, row_number有什么區別呢?
它們的區別我舉個例子,你們一下就能看懂:
select *,rank() over (order by 成績 desc) as ranking,dense_rank() over (order by 成績 desc) as dese_rank,row_number() over (order by 成績 desc) as row_num from 班級;?得到結果:
從上面的結果可以看出:
rank函數:這個例子中是5位,5位,5位,8位,也就是如果有并列名次的行,會占用下一名次的位置。比如正常排名是1,2,3,4,但是現在前3名是并列的名次,結果是:1,1,1,4。
dense_rank函數:這個例子中是5位,5位,5位,6位,也就是如果有并列名次的行,不占用下一名次的位置。比如正常排名是1,2,3,4,但是現在前3名是并列的名次,結果是:1,1,1,2。
row_number函數:這個例子中是5位,6位,7位,8位,也就是不考慮并列名次的情況。比如前3名是并列的名次,排名是正常的1,2,3,4。
這三個函數的區別如下:
題目要求“如果出現并列第一的情況,則同為第一名”。所以,我們使用窗口函數dense_rank。
步驟一:按課程分組(partiotion by 課程號),并按成績降序排列(order by 成績 desc),套入窗口函數的語法,就是下面的sql語句:
select *,dense_rank() over(partition by 課程號order by 成績 desc) as排名 from 成績表;運行結果如下:
步驟二:篩選出前3高的成績,所以我們在上一步基礎上加入一個where字句來篩選出符合條件的數據。(where 排名 <=3)
3、總結
1)對比rank, dense_rank, row_number
rank:相同分數,并列排名,按人數后補
dense_rank,:相同分數,并列排名,按排名后補
row_number:相同分數,不并列排名
2)窗口函數使用模板
參考資料
總結
以上是生活随笔為你收集整理的对比rank, dense_rank, row_number的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode刷题(1)两数之和
- 下一篇: Tuxedo 中间件学习心得 一