知(zhi)方(fang)可補不足~row_number,rank,dense_rank,ntile排名函數的(de)用法
這篇文章介紹(shao)SQL中(zhong)4個很有意思的函數,我稱它的行標函數,它們是(shi)row_number,rank,dense_rank和ntile,下面(mian)分別進行介紹(shao)。
一(yi) row_number:它為數(shu)據表加一(yi)個叫“行標示”的(de)列(lie),它在數(shu)據表中(zhong)是連續的(de),我們必須按著(zhu)某個順序把表排(pai)序之后,才能使用row_number,看下列(lie)例(li)子:
SELECT row_number() OVER ( ORDER BY SalePrice ) AS row , * FROM Product
結果表被加上了行號:
這個row_number在(zai)平常(chang)用的最多,它(ta)可以用來實現數據表的分頁功能(neng),看下(xia)面代(dai)碼
SELECT * FROM ( SELECT row_number() OVER ( ORDER BY SalePrice ) AS row , * FROM Product ) AS Result WHERE Result.row BETWEEN 1 AND 2
它的含義是從第一條記錄開始,取出2條記錄,如果你想一頁顯示10條記錄,可以使用BETWEEN 1 AND 10,如果想得到第二次的10條,那條件就變成BETWEEN 11 AND 20
二 rank:類(lei)型于row_number,不(bu)同(tong)之處(chu)在(zai)于,它會(hui)對order by 的(de)字(zi)(zi)段進行(xing)(xing)處(chu)理,如果這(zhe)個(ge)字(zi)(zi)段值相同(tong),那么(me),行(xing)(xing)號保(bao)持不(bu)變,如代碼:
SELECT RANK() OVER ( ORDER BY SalePrice ) AS row , SalePrice , ProductID , ProductName FROM Product
結果如下:
三 dense_rank:與(yu)rank類型,不同之(zhi)處在于(yu)行號是否保(bao)留(liu)一個位(wei)(wei)置(zhi),rank對保(bao)留(liu)這個位(wei)(wei)置(zhi),即上面圖中,row的(de)值由(you)1直(zhi)接變(bian)為3,因為它(ta)的(de)1出現了兩次,所以(yi)為2保(bao)留(liu)了一個位(wei)(wei)置(zhi),而dense_rank不會保(bao)留(liu)2這個位(wei)(wei)置(zhi),即實(shi)現的(de)行號2其(qi)實(shi)是排在了第3位(wei)(wei),如代碼:
SELECT DENSE_RANK() OVER ( ORDER BY SalePrice ) AS row , SalePrice , ProductID , ProductName FROM Product
結果如下:
四 ntile:為裝桶(tong)(tong)操作,ntile(桶(tong)(tong)數)它在運行之前,先(xian)確定產生的桶(tong)(tong)數,然后根據桶(tong)(tong)數去生成行標,如代(dai)碼(ma):
SELECT NTILE(1) OVER ( ORDER BY SalePrice ) AS ntile , SalePrice , ProductID , ProductName FROM Product
結果如下:
如果設為(wei)NTILE(3),那結(jie)果就為(wei):
當(dang)我們面對一個復雜(za)的(de)問(wen)題(ti)時,考驗的(de)不是你是否能(neng)解(jie)決(jue)(jue),而是你采取哪種方式去解(jie)決(jue)(jue)以及代碼的(de)性能(neng)問(wen)題(ti)。