各個組有編號,編號從一開始。對於每一個行,NTILE函數將返回此行所屬的組的編號。如果分區的行數不能被整數整除,則將導致一個成員有兩種大小不同的組。按照OVER子句指定的順序,較大的組排在較小的組前面。用NTILEFunction Compute排名值與其它方法一樣簡單分區排名方案和排名值效率分析圖文+測試代碼】),唯一的區別在於,NTILE函數接受一個表示組的數量的參數,而其它的方法是沒有參數的。
SQL代碼和效果如下:
- Code
- ifOBJECT_ID('Sales')isnotnull
- droptableSales;
- createtableSales
- (
- empidvarchar(10)notnullprimarykey,
- qtyintnotnull
- )
- insertintoSales(empid,qty)values('A',300);
- insertintoSales(empid,qty)values('B',100);
- insertintoSales(empid,qty)values('C',200);
- insertintoSales(empid,qty)values('D',200);
- insertintoSales(empid,qty)values('E',250);
- insertintoSales(empid,qty)values('F',300);
- insertintoSales(empid,qty)values('H',250);
- insertintoSales(empid,qty)values('I',250);
- insertintoSales(empid,qty)values('J',100);
- insertintoSales(empid,qty)values('K',200);
- insertintoSales(empid,qty)values('G',100);
- --------------------------------------------------
- selectempid,qty,NTILE(9)over(orderbyqty)astilefromSales
執行結果:
那麼在沒有出現SQLServer2005之前我們又是怎樣做來達到這樣的效果的呢?下面我將給大家介紹兩種方法來達到這個需求:
方法一:首先計算表的行號排名值),根據指定的組的數量得到每組內的記錄數量。然後利用組號計算公式:行號-1)/組大小+1,返回每條記錄的組號。
SQL代碼如下:
- Code
- eclare@numtilesint;
- set@numtiles=9;--組數
-
- selectempid,qty,CAST((rn-1)/tilesize+1asint)astile
- from(selectempid,qty,rn,1.0*numrows/@numtilesastilesizefrom(selectempid,qty,(selectCOUNT(*)fromSalesasS2whereS2.qty
方法二:首先計算表的行號排名值),根據指定的組的數量得到每組內的記錄數量。然後利用下面組號計算公式,返回每條記錄的組號。
If(行號<=組大小+1)*剩餘行數)then
組號=行號-1)/組大小+1)+1
Else
組號=行號-剩餘行數-1)/組大小+1
SQL代碼如下:
- Code
- declare@numtileint;
- set@numtile=9;--組數
-
- selectempid,qty,rn,
- casewhenrn<=(tilesize+1)*remainder
- then(rn-1)/(tilesize+1)+1
- else(rn-remainder-1)/(tilesize)+1
- endastiles
- from
- (
- selectempid,qty,rn,numrows/@numtileastilesize,numrows%@numtileasremainder
- from
- (
- selectempid,qty,(selectCOUNT(*)fromSalesasS2whereS2.qty
- )asD1
- )asD2orderbyqty,empid
- SQL Server 2005商業智慧的10個關鍵特性
- 在T-SQL中使用暫存資料表的注意事項
- SQL Server資料庫管理常用的SQL和T-SQL語句(1)
- 用T-SQL操作面試SQL Server開發人員(1)
- SQL Server 2005中的T-SQL
- T-SQL實用例句