资源描述:
《sqlserver2005实现排序报表的利器排序函数rank、denserank、ntile和rownumber》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、SQLServer2005新增了排名函数,一共四个,其中RANK()DENSE_RANK()NTILE()这三个函数是制作带有排名列报表的利器,ROW_NUMBER()函数在分页存储过程中被广泛使用排名函数有一个明显的共性,就是与over()子句配合使用与排名函数一起使用的over()子句有两个参数partition分组方式orderby排序方式RANK()和DENSE_RANK()是一对兄弟,唯一的不同是当使用RANK()进行排名时由于orderby参数的值可能存在相等的情况,比如有两个第一,那么下一
2、个会被排名在第三,即使用RANK()排名时,得到数值并不是连续的(1、1、3),而是用DENSE_RANK()时,得到的永远是连续的(1、1、2).语法:RANK()OVER([])DENSE_RANK()OVER([])示例:USEAdventureWorks;GOSELECTi.ProductID,p.Name,i.LocationID,i.Quan
3、tity,RANK()OVER(PARTITIONBYi.LocationIDorderbyi.Quantity)asRANKFROMProduction.ProductInventoryiJOINProduction.ProductpONi.ProductID=p.ProductIDORDERBYi.LocationID,RANKGOUSEAdventureWorks;GOSELECTi.ProductID,p.Name,i.LocationID,i.Quantity,DENSE_RANK()OVER
4、(PARTITIONBYi.LocationIDorderbyi.Quantity)asDENSE_RANKFROMProduction.ProductInventoryiJOINProduction.ProductpONi.ProductID=p.ProductIDORDERBYi.LocationID,DENSE_RANK;GO结果:NTILE()我的理解是将结果集按片分割,SQLServer帮助里写的是存储桶。语法:NTILE(integer_expression)OVER([5、_by_clause>])与其他排名函数不同NTILE()多了一个参数integer_expression,这个参数是一个正整数,数据类型支持bigint.integer_expression参数决定了结果集最终分成几片,或者是分布到几个桶中.例如integer_expression参数为5,如果结果集的行数为50,正好能够整除,那么这50行数据会被分成5片,每片10行数据;如果不能够整除,结果集是53行数据,那么第一、二、三片,每片11行数据,其余10行数据.示例:U
6、SEAdventureWorks;GOSELECTc.FirstName,c.LastName,NTILE(5)OVER(ORDERBYSalesYTDDESC)AS'Quartile',s.SalesYTD,a.PostalCodeFromSales.SalesPersonsJOINPerson.Contactcons.SalesPersonID=c.ContactIDJOINPerson.AddressaONa.AddressID=c.ContactIDWHERETerritoryIDISNOTNU
7、LLANDSalesYTD<>0;GO结果:ROW_NUMBER()函数用来生成数据行在结果集中的序号语法:ROW_NUMBER()OVER([])示例:USEAdventureWorksGOSELECTc.FirstName,c.LastName,ROW_NUMBER()OVER(ORDERBYSalesYTDDESC)AS'RowNumber',s.SalesYTD,a.PostalCodeFROMSales.SalesPe
8、rsonsJOINPerson.Contactcons.SalesPersonID=c.ContactIDJOINPerson.AddressaONa.AddressID=c.ContactIDWHERETerritoryIDISNOTNULLANDSalesYTD<>0--以下示例将返回行号为50到60(含)的行,并以OrderDate排序。--这在分页时非常实用--关于WITH语法应查阅CTE相关内容USEAdventureWorks;