真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SQL中NTILE函數(shù)怎么用

小編給大家分享一下SQL中NTILE函數(shù)怎么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

臺(tái)兒網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)從2013年創(chuàng)立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

NTILE

ntile函數(shù)可以對(duì)序號(hào)進(jìn)行分組處理,將有序分區(qū)中的行分發(fā)到指定數(shù)目的組中。 各個(gè)組有編號(hào),編號(hào)從一開始。 對(duì)于每一個(gè)行,ntile 將返回此行所屬的組的編號(hào)。這就相當(dāng)于將查詢出來(lái)的記錄集放到指定長(zhǎng)度的數(shù)組中,每一個(gè)數(shù)組元素存放一定數(shù)量的記錄。ntile函數(shù)為每條記錄生成的序號(hào)就是這條記錄所有的數(shù)組元素的索引(從1開始)。也可以將每一個(gè)分配記錄的數(shù)組元素稱為“桶”。ntile函數(shù)有一個(gè)參數(shù),用來(lái)指定桶數(shù)。下面的SQL語(yǔ)句使用ntile函數(shù)對(duì)Order表進(jìn)行了裝桶處理:

select NTILE(4) OVER(order by [SubTime] desc) as ntile,* from [Order]

查詢結(jié)果如下圖所示:

SQL中NTILE函數(shù)怎么用

Order表的總記錄數(shù)是6條,而上面的Sql語(yǔ)句ntile函數(shù)指定的組數(shù)是4,那么Sql Server2005是怎么來(lái)決定每一組應(yīng)該分多少條記錄呢?這里我們就需要了解ntile函數(shù)的分組依據(jù)(約定)。

ntile函數(shù)的分組依據(jù)(約定):

1、每組的記錄數(shù)不能大于它上一組的記錄數(shù),即編號(hào)小的桶放的記錄數(shù)不能小于編號(hào)大的桶。也就是說(shuō),第1組中的記錄數(shù)只能大于等于第2組及以后各組中的記錄數(shù)。

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

這里對(duì)約定2進(jìn)行詳細(xì)說(shuō)明一下,以便于更好的理解。

首先系統(tǒng)會(huì)去檢查能不能對(duì)所有滿足條件的記錄進(jìn)行平均分組,若能則直接平均分配就完成分組了;若不能,則會(huì)先分出一個(gè)組,這個(gè)組分多少條記錄呢?就是 (總記錄數(shù)/總組數(shù))+1 條,之所以分配 (總記錄數(shù)/總組數(shù))+1 條是因?yàn)楫?dāng)不能進(jìn)行平均分組時(shí),總記錄數(shù)%總組數(shù)肯定是有余的,又因?yàn)榉纸M約定1,所以先分出去的組需要+1條。

分完之后系統(tǒng)會(huì)繼續(xù)去比較余下的記錄數(shù)和未分配的組數(shù)能不能進(jìn)行平均分配,若能,則平均分配余下的記錄;若不能,則再分出去一組,這個(gè)組的記錄數(shù)也是(總記錄數(shù)/總組數(shù))+1條。

然后系統(tǒng)繼續(xù)去比較余下的記錄數(shù)和未分配的組數(shù)能不能進(jìn)行平均分配,若能,則平均分配余下的記錄;若還是不能,則再分配出去一組,繼續(xù)比較余下的......這樣一直進(jìn)行下去,直至分組完成。

舉個(gè)例子,將51條記錄分配成5組,51%5==1不能平均分配,則先分出去一組(51/5)+1=11條記錄,然后比較余下的 51-11=40 條記錄能否平均分配給未分配的4組,能平均分配,則剩下的4組,每組各40/4=10 條記錄,分配完成,分配結(jié)果為:11,10,10,10,10,曉菜鳥我開始就錯(cuò)誤的以為他會(huì)分配成 11,11,11,11,7。

根據(jù)上面的兩個(gè)約定,可以得出如下的算法:

//mod表示取余,p表示取整.if(記錄總數(shù) mod 桶數(shù)==0)
{
  recordCount=記錄總數(shù) p 桶數(shù);
  //將每桶的記錄數(shù)都設(shè)為recordCount.}else{
  recordCount1=記錄總數(shù) p 桶數(shù)+1;
  int n=1;//n表示桶中記錄數(shù)為recordCount1的最大桶數(shù).  m=recordCount1*n;  while(((記錄總數(shù)-m) mod (桶數(shù)- n)) !=0)
  {
    n++;
    m=recordCount1*n;
  }
  recordCount2=(記錄總數(shù)-m) p (桶數(shù)-n);
  //將前n個(gè)桶的記錄數(shù)設(shè)為recordCount1.  //將n+1個(gè)至后面所有桶的記錄數(shù)設(shè)為recordCount2.}

 NTILE()函數(shù)算法實(shí)現(xiàn)代碼

根據(jù)上面的算法,如果總記錄數(shù)為59,總組數(shù)為5,則 n=4 , recordCount1=12 , recordCount2=11,分組結(jié)果為 :12,12,12,12,11。

如果總記錄數(shù)為53,總組數(shù)為5,則 n=3 , recordCount1=11 , recordCount2=10,分組結(jié)果為:11,11,11,10,10。

就拿上面的例子來(lái)說(shuō),總記錄數(shù)為6,總組數(shù)為4,通過(guò)算法得到 n=2 , recordCount1=2 , recordCount2=1,分組結(jié)果為:2,2,1,1。

select ntile,COUNT([ID]) recordCount from (    select NTILE(4) OVER(order by [SubTime] desc) as ntile,* from [Order]) as tgroup by t.ntile

運(yùn)行Sql,分組結(jié)果如圖:

SQL中NTILE函數(shù)怎么用

比對(duì)算法與Sql Server的分組結(jié)果是一致的,說(shuō)明算法沒(méi)錯(cuò)。

以上是“SQL中NTILE函數(shù)怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!


分享標(biāo)題:SQL中NTILE函數(shù)怎么用
瀏覽地址:http://weahome.cn/article/gjijse.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部