首頁 >資料庫 >Oracle >淺談Oracle中的row_number()、rank()、dense_rank()

淺談Oracle中的row_number()、rank()、dense_rank()

青灯夜游
青灯夜游轉載
2020-05-13 15:03:082558瀏覽

下面這篇文章和大家談談Oracle中的row_number()、rank()、dense_rank()。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。

淺談Oracle中的row_number()、rank()、dense_rank()

Oracle:row_number()、rank()、dense_rank()

語法:ROW_NUMBER( )  OVER();

row_number的用途非常廣泛,排序最好用它,它會為查詢出來的每一行記錄產生一個序號,依序排序且不會重複,注意使用row_number函數時必須要用over子句選擇對某一列進行排序才能產生序號。

rank函數用來傳回結果集的分區內每行的排名,行的排名是相關行之前的排名數加一。簡單來說rank函數就是對查詢出來的記錄進行排名,與row_number函數不同的是,rank函數考慮到了over子句中排序字段值相同的情況,如果使用rank函數來生成序號,over子句中排序字段值相同的序號是一樣的,後面字段值不相同的序號將跳過相同的排名號排下一個,也就是相關行之前的排名數加一,可以理解為根據當前的記錄數生成序號,後面的記錄依此類推。

dense_rank函數的函數與rank函數類似,dense_rank函數在產生序號時是連續的,而rank函數產生的序號有可能不連續。 dense_rank函數出現相同排名時,將不跳過相同排名號,rank值緊接上一次的rank值。在各個分組內,rank()是跳躍排序,有兩個第一名時接下來就是第三名,dense_rank()是連續排序,有兩個第一名時仍然跟著第二名。

關於Parttion by:Parttion by關鍵字是Oracle中分析性函數的一部分,用於給結果集進行分區。它和聚合函數Group by不同的地方在於它只是將原始資料進行名次排列,能夠傳回一個分組中的多筆記錄(記錄數不變),而Group by是對原始資料進行聚合統計,一般只有一筆反映統計值的結果(每組回傳一條)。

TIPS:

使用rank over()的時候,空值是最大的,如果排序欄位為null, 可能造成null欄位排在最前面,影響排序結果。

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

總結:

##在使用排名函數的時候需要注意以下三點:

1、排名函數必須有OVER 子句。

2、排名函數必須有包含 ORDER BY 的 OVER 子句。

3、分組內從1開始排序。

推薦教學:《

Oracle教學

以上是淺談Oracle中的row_number()、rank()、dense_rank()的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除