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

sqlserver排名函數

詳細說明 int elong 大於 which div 基本 pre 技術

在做開發的時候,排名函數是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開始排序。

sqlserver排名函數