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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle中rank() over, dense_rank(), row_number() 的区别

發(fā)布時(shí)間:2025/3/20 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle中rank() over, dense_rank(), row_number() 的区别 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Oracle中rank() over, dense_rank(), row_number() 的區(qū)別

假設(shè)現(xiàn)在有一張學(xué)生表student,學(xué)生表中有姓名、分?jǐn)?shù)、課程編號(hào),現(xiàn)在我需要按照課程對(duì)學(xué)生的成績(jī)進(jìn)行排序。

select * from student

1. rank over ()可以實(shí)現(xiàn)對(duì)學(xué)生排名,特點(diǎn)是成績(jī)相同的兩名是并列,如下1 2 2 4 5

select name,
? ? ? course,
? ? ? rank() over(partition by course order by score desc) as rank
? from student;

2. dense_rank()和rank over()很像,但學(xué)生成績(jī)并列后并不會(huì)空出并列所占的名次,如下1 2 2 3 4

select name,
? ? ? course,
? ? ? dense_rank() over(partition by course order by score desc) as rank
? from student;

3. row_number這個(gè)函數(shù)不需要考慮是否并列,那怕根據(jù)條件查詢出來的數(shù)值相同也會(huì)進(jìn)行連續(xù)排名

select name,
? ? ? course,
? ? ? row_number() over(partition by course order by score desc) as rank
? from student;


答疑:

1. partition by用于給結(jié)果集進(jìn)行分區(qū)。

2. partition by和group by有何區(qū)別?

partition by只是將原始數(shù)據(jù)進(jìn)行名次排列(記錄數(shù)不變)


group by是對(duì)原始數(shù)據(jù)進(jìn)行聚合統(tǒng)計(jì)(記錄數(shù)可能變少, 每組返回一條)

3. 使用rank over()的時(shí)候,空值是最大的,如果排序字段為null, 可能造成null字段排在最前面,影響排序結(jié)果。

可以這樣: rank over(partition by course order by score desc nulls last)

總結(jié)

以上是生活随笔為你收集整理的Oracle中rank() over, dense_rank(), row_number() 的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。