天天看點

mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()

mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()

mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()

row_number會為查詢出來的每一行記錄生成一個序号,依次順序排序且不會重複,注意使用row_number函數時必須要用over子句選擇對某一列進行排序才能生成序号。

mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()
mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()

rank函數用于傳回結果集的分區内每行的排名,行的排名是相關行之前的排名數加一。rank與row_number函數不同的是,rank函數考慮到over子句中排序字段值相同的情況,over子句中排序字段值相同的序号是一樣的,後面字段值不相同的序号将跳過相同的排名号排下一個,也就是相關行之前的排名數加一,可以了解為根據目前的記錄數生成序号,後面的記錄依此類推。

mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()

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

mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()
mysql 序号函數 ROW_NUMBER()、RANK()、DENSE_RANK()

關于Partition by:

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

TIPS:

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

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

繼續閱讀