Transact-SQL提供了4個排名函數: RANK(),DENSE_RANK(),ROW_NUMBER(),NTILE()
下面是對這4個函數的解釋:
RANK()
返回結果集的分區內每行的排名。行的排名是相關行之前的排名數加一。
如果兩個或多個行與一個排名關聯,則每個關聯行將得到相同的排名。
例如,如果兩位銷售員具有相同的SalesYTD值,則他們將并列第一。由于已有兩行排名在前,所以具有下一個最大SalesYTD的銷售人員將排名第三。
因此,RANK 函數并不總返回連續整數。
DENSE_RANK()
返回結果集分區中行的排名,在排名中沒有任何間斷。行的排名等于所討論行之前的所有排名數加一。
如果有兩個或多個行受同一個分區中排名的約束,則每個約束行將接收相同的排名。
例如,如果兩位頂尖銷售員具有相同的 SalesYTD 值,則他們將并列第一。接下來 SalesYTD 最高的銷售人員排名第二。該排名等于該行之前的所有行數加一。
因此,DENSE_RANK 函數返回的數字沒有間斷,并且始終具有連續的排名。
ROW_NUMBER()
回結果集分區內行的序列號,每個分區的第一行從 1 開始。
ORDER BY 子句可確定在特定分區中為行分配唯一 ROW_NUMBER 的順序。
NTILE()
將有序分區中的行分發到指定數目的組中。各個組有編號,編號從一開始。對于每一個行,NTILE 將返回此行所屬的組的編號。
如果分區的行數不能被 integer_expression 整除,則將導致一個成員有兩種大小不同的組。按照 OVER 子句指定的順序,較大的組排在較小的組前面。
例如,如果總行數是 53,組數是 5,則前三個組每組包含 11 行,其余兩個組每組包含 10 行。
另一方面,如果總行數可被組數整除,則行數將在組之間平均分布。
例如,如果總行數為 50,有五個組,則每組將包含 10 行。