日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对比rank, dense_rank, row_number

發布時間:2023/12/9 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对比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)

    代碼塊select 課程號,學號,成績,排名 from (select *,dense_rank() over (partition by 課程號order by 成績 desc) as 排名 from 成績表) as aa where 排名 <=3;

    3、總結

    1)對比rank, dense_rank, row_number

    rank:相同分數,并列排名,按人數后補
    dense_rank,:相同分數,并列排名,按排名后補
    row_number:相同分數,不并列排名


    2)窗口函數使用模板

    # topN問題 sql模板 select * from (select *, row_number() over (partition by 要分組的列名order by 要排序的列名 desc) as 排名from 表名) as a where 排名 <= N;

    參考資料

    總結

    以上是生活随笔為你收集整理的对比rank, dense_rank, row_number的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。