1. 程式人生 > >sqlserver排名函式

sqlserver排名函式

在做開發的時候,排名函式是sqlserver經常用到的函式,在分頁的時候需要用,分組的時候也要用,主要排名函式有row-number,rank(),dense-rank(),NTILE()接下來詳細說明其使用

1.row-number

作用:排序,實現分頁

例如:

1 SELECT  *
2 FROM    ( SELECT    ROW_NUMBER() OVER ( ORDER BY FDate DESC ) AS R ,
3                     *
4           FROM      dbo.FI_ProfitAndLoss
5         ) AS
A 6 WHERE R BETWEEN 1 AND 100;

結果如下:

 

注意:1、要使用over()子句選擇對某一列進行排序才能生成序號,並實現排序。

2、over()子句中的order by 欄位 要與sql排序記錄中的order by 欄位保持一致, 否則得到的序號可能不是連續的(序號不連續,比較亂)。

2.rank()

 作用:用於返回結果集的分割槽內每行的排名

例如:

1 SELECT  RANK() OVER ( ORDER BY FDate DESC ) AS R ,
2         FDate
3 FROM    dbo.FI_ProfitAndLoss;

 結果如下:

 

圖中前十條記錄的FDate相同,所以他們的序號是一樣的,第11條記錄的序號就是11,

注意:如果第一名和第二名的資料相同,則並列為第一名,接下來為第三名,為分組不連續排名。

3、dense-rank()

作用:與rank()基本一樣,但生成的分組排名序號是連續的。

例如:

1 SELECT  DENSE_RANK() OVER ( ORDER BY FDate DESC ) AS R ,
2         FDate
3 FROM    dbo.FI_ProfitAndLoss;

 

結果如下

圖中前十條記錄的FDate相同,所以他們的序號是一樣的,第11條記錄的序號緊接上一個的序號,所以為2不為3,後面的依此類推

4、NTILE()

作用:ntile函式可以對序號進行分組處理,將有序分割槽中的行分發到指定數目的組中。 各個組有編號,編號從一開始。 對於每一個行,ntile 將返回此行所屬的組的編號。這就相當於將查詢出來的記錄集放到指定長度的陣列中,每一個數組元素存放一定數量的記錄。ntile函式為每條記錄生成的序號就是這條記錄所有的陣列元素的索引(從1開始)。也可以將每一個分配記錄的陣列元素稱為“桶”。ntile函式有一個引數,用來指定桶數。下面的SQL語句使用ntile函式對FI_ProfitAndLoss表進行了裝桶處理:

例如:

1 SELECT  NTILE(6) OVER ( ORDER BY FDate DESC ) AS R ,
2         FDate
3 FROM    dbo.FI_ProfitAndLoss WHERE companyid='264';

 結果如下:

 

如圖,一共19條資料,分6組,第一組4條資料,其他五組都是3條資料 。

1、每組的記錄數不能大於它上一組的記錄數,即編號小的桶放的記錄數不能小於編號大的桶。也就是說,第1組中的記錄數只能大於等於第2組及以後各組中的記錄數。

2、所有組中的記錄數要麼都相同,要麼從某一個記錄較少的組(命名為X)開始後面所有組的記錄數都與該組(X組)的記錄數相同。也就是說,如果有個組,前三組的記錄數都是9,而第四組的記錄數是8,那麼第五組和第六組的記錄數也必須是8。

總結:

在使用排名函式的時候需要注意以下三點:

  1、排名函式必須有 OVER 子句。

  2、排名函式必須有包含 ORDER BY 的 OVER 子句。

  3、分組內從1開始排序。