語法: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開始排序,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/25074.html
標籤:Oracle
下一篇:詳細解說關系型資料庫
