語法:ROW_NUMBER() OVER();函數
row_number的用途很是普遍,排序最好用它,它會爲查詢出來的每一行記錄生成一個序號,依次排序且不會重複,注意使用row_number函數時必需要用over子句選擇對某一列進行排序才能生成序號。排序
rank函數用於返回結果集的分區內每行的排名,行的排名是相關行以前的排名數加一。簡單來講rank函數就是對查詢出來的記錄進行排名,與row_number函數不一樣的是,rank函數考慮到了over子句中排序字段值相同的狀況,若是使用rank函數來生成序號,over子句中排序字段值相同的序號是同樣的,後面字段值不相同的序號將跳過相同的排名號排下一個,也就是相關行以前的排名數加一,能夠理解爲根據當前的記錄數生成序號,後面的記錄依此類推。it
dense_rank函數的功能與rank函數相似,dense_rank函數在生成序號時是連續的,而rank函數生成的序號有可能不連續。dense_rank函數出現相同排名時,將不跳過相同排名號,rank值緊接上一次的rank值。在各個分組內,rank()是跳躍排序,有兩個第一名時接下來就是第三名,dense_rank()是連續排序,有兩個第一名時仍然跟着第二名。io
關於Parttion by:Parttion by關鍵字是Oracle中分析性函數的一部分,用於給結果集進行分區。它和聚合函數Group by不一樣的地方在於它只是將原始數據進行名次排列,可以返回一個分組中的多條記錄(記錄數不變),而Group by是對原始數據進行聚合統計,通常只有一條反映統計值的結果(每組返回一條)。ast
TIPS:語法
使用rank over()的時候,空值是最大的,若是排序字段爲null, 可能形成null字段排在最前面,影響排序結果。統計
能夠這樣: rank over(partition by course order by score desc nulls last)總結
總結:數據
在使用排名函數的時候須要注意如下三點:查詢
一、排名函數必須有 OVER 子句。
二、排名函數必須有包含 ORDER BY 的 OVER 子句。
三、分組內從1開始排序。