資源描述:
《sql server排序函數(shù)》由會員上傳分享,免費在線閱讀,更多相關內容在行業(yè)資料-天天文庫。
1、排名函數(shù)是SQLServer2005新加的功能。在SQLServer2005中有如下四個排名函數(shù):1.row_number2.rank3.dense_rank4.ntile下面分別介紹一下這四個排名函數(shù)的功能及用法。在介紹之前假設有一個t_table表,表結構與表中的數(shù)據(jù)如圖1所示:圖1其中field1字段的類型是int,field2字段的類型是varchar一、row_numberrow_number函數(shù)的用途是非常廣泛,這個函數(shù)的功能是為查詢出來的每一行記錄生成一個序號。row_number函數(shù)的用法如下面的SQL語句所示:selectrow_number()over(or
2、derbyfield1)asrow_number,*fromt_table上面的SQL語句的查詢結果如圖2所示。圖2其中row_number列是由row_number函數(shù)生成的序號列。在使用row_number函數(shù)是要使用over子句選擇對某一列進行排序,然后才能生成序號。實際上,row_number函數(shù)生成序號的基本原理是先使用over子句中的排序語句對記錄進行排序,然后按著這個順序生成序號。over子句中的orderby子句與SQL語句中的orderby子句沒有任何關系,這兩處的orderby可以完全不同,如下面的SQL語句所示:selectrow_number()over
3、(orderbyfield2desc)asrow_number,*fromt_tableorderbyfield1desc上面的SQL語句的查詢結果如圖3所示。圖3我們可以使用row_number函數(shù)來實現(xiàn)查詢表中指定范圍的記錄,一般將其應用到Web應用程序的分頁功能上。下面的SQL語句可以查詢t_table表中第2條和第3條記錄:witht_rowtableas(selectrow_number()over(orderbyfield1)asrow_number,*fromt_table)select*fromt_rowtablewhererow_number>1androw_
4、number<4orderbyfield1上面的SQL語句的查詢結果如圖4所示。圖4另外要注意的是,如果將row_number函數(shù)用于分頁處理,over子句中的orderby與排序記錄的orderby應相同,否則生成的序號可能不是有續(xù)的。當然,不使用row_number函數(shù)也可以實現(xiàn)查詢指定范圍的記錄,就是比較麻煩。一般的方法是使用顛倒Top來實現(xiàn),例如,查詢t_table表中第2條和第3條記錄,可以先查出前3條記錄,然后將查詢出來的這三條記錄按倒序排序,再取前2條記錄,最后再將查出來的這2條記錄再按倒序排序,就是最終結果。SQL語句如下:select*from(selectt
5、op2*from(selecttop3*fromt_tableorderbyfield1)aorderbyfield1desc)borderbyfield1上面的SQL語句查詢出來的結果如圖5所示。圖5這個查詢結果除了沒有序號列row_number,其他的與圖4所示的查詢結果完全一樣。二、rankrank函數(shù)考慮到了over子句中排序字段值相同的情況,為了更容易說明問題,在t_table表中再加一條記錄,如圖6所示。圖6在圖6所示的記錄中后三條記錄的field1字段值是相同的。如果使用rank函數(shù)來生成序號Rank函數(shù)生成序號,根據(jù)over進行分組,當over分組字段值相同時,
6、生成序號也將相同,這3條記錄的序號是相同的,而第4條記錄會根據(jù)當前的記錄數(shù)生成序號,后面的記錄依此類推,也就是說,在這個例子中,第4條記錄的序號是4,而不是2。rank函數(shù)的使用方法與row_number函數(shù)完全相同,SQL語句如下:selectrank()over(orderbyfield1),*fromt_tableorderbyfield1上面的SQL語句的查詢結果如圖7所示。圖7三、dense_rankdense_rank函數(shù)的功能與rank函數(shù)類似,只是在生成序號時是連續(xù)的,而rank函數(shù)生成的序號有可能不連續(xù)。如上面的例子中如果使用dense_rank函數(shù),第4條記
7、錄的序號應該是2,而不是4。如下面的SQL語句所示:selectdense_rank()over(orderbyfield1),*fromt_tableorderbyfield1上面的SQL語句的查詢結果如圖8所示。圖8可以比較圖7和圖8所示的查詢結果有什么不同四、ntilentile函數(shù)可以對序號進行分組處理。這就相當于將查詢出來的記錄集放到指定長度的數(shù)組中,每一個數(shù)組元素存放一定數(shù)量的記錄。ntile函數(shù)為每條記錄生成的序號就是這條記錄所有的數(shù)組元素的索引(從1開始)。也可以將每一個分配