各個組有編號,編號從一開始。對于每一個行,NTILE函數(shù)將返回此行所屬的組的編號。如果分區(qū)的行數(shù)不能被整數(shù)整除,則將導(dǎo)致一個成員有兩種大小不同的組。按照OVER子句指定的順序,較大的組排在較小的組前面。用NTILE函數(shù)計算排名值與其它方法一樣簡單(分區(qū)排名方案和排名值效率分析【圖文+測試代碼】),唯一的區(qū)別在于,NTILE函數(shù)接受一個表示組的數(shù)量的參數(shù),而其它的方法是沒有參數(shù)的。
SQL數(shù)據(jù)庫代碼和效果如下:
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 執(zhí)行結(jié)果效果圖:
那么在沒有出現(xiàn)SQLServer2005之前我們又是怎樣做來達到這樣的效果的呢?下面我將給大家介紹兩種方法來達到這個需求:
方法一:首先計算表的行號(排名值),根據(jù)指定的組的數(shù)量得到每組內(nèi)的記錄數(shù)量。然后利用組號計算公式:(行號-1)/組大小+1,返回每條記錄的組號。
SQL代碼如下:
Code eclare@numtilesint; set@numtiles=9;--組數(shù) selectempid,qty,CAST((rn-1)/tilesize+1asint)astile from(selectempid,qty,rn,1.0*numrows/@numtilesastilesizefrom(selectempid,qty,(selectCOUNT(*)fromSalesasS2whereS2.qty方法二:首先計算表的行號(排名值),根據(jù)指定的組的數(shù)量得到每組內(nèi)的記錄數(shù)量。然后利用下面組號計算公式,返回每條記錄的組號。
If(行號<=(組大小+1)*剩余行數(shù))then
組號=(行號-1)/(組大小+1)+1
Else
組號=(行號-剩余行數(shù)-1)/組大小+1