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 ) ASA 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開始排序。