row_number() order() 函數會為查詢出來的每一行記錄生成一個序號,依次排序且不會重復,注意使用row_number函數時必須要用over子句選擇對某一列進行排序才能生成序號。
rank() order() 函數用於返回結果集的分區內每行的排名,行的排名是相關行之前的排名數加一。簡單來說rank函數就是對查詢出來的記錄進行排名,與row_number函數不同的是,rank函數考慮到了over子句中排序字段值相同的情況,如果使用rank函數來生成序號,對於OVER中字段相同的排序是一樣的,下一個不同的字段的排序就是上一個排序+上一個的同字段的數量。
dense_rank() order() 函數與rank函數相似,都考慮到了over子句中排序字段值相同的情況,不同的是dense_rank()生成的序號是連續的,當出現相同排名時,下一個字段值相同的排名時緊接着上一個排名的值即上一個排名值加1,比如,針對dense_rank()來說,有兩個排序第一,那么下一個排序就是第二,而對於rank()來說兩個排序第一下一個排序就是第三。對於不存在相同字段的情況dense_rank()與rank()以及row_number() 的結果是一樣的。
有如下數據:
row_number order()按訂單號由小到大排序:
rank() order()按訂單號由小到大排序:
dense_rank() order()按訂單號由小到大排序: