SQL SERVER的排名函数

96 阅读2分钟

ROW_NUMBER() :给整体结果集中的行标明序号,依次加1

\

RANK():先分组(也可以不分组),然后每组的行各自标明序号,依次加1,假如该组中排序列的值相同,就会有一些行拥有相同的序号,但接下来的行的序号会不连贯。比如有两行的序号是并列第1,则第3行的序号是3而不是2。

\

DENSE_RANK():接近RANK(),区别是虽然也有相同序号,但排名是连贯的。比如有两行的序号是并列第1,则第3行的序号是2而不是3。

\

NTILE(n):将结果集分成n等份,然后每等份里面的行标明序号,同一份里的序号都是相同的(比如说,分成4等份,份1里所有行的序号都是1,份2里所有行的序号都是2,以此类推);或者先分组,然后每组分成n等份,等份里面再标明序号。(什么情况下会用到呢?)

 

 

USE AdventureWorks;

GO



SELECT c.FirstName, c.LastName

    ,ROW_NUMBER()
 OVER (ORDER BY a.PostalCode) AS 'Row Number
'

    ,RANK()
 OVER (ORDER BY a.PostalCode) AS 'Rank
'

    ,DENSE_RANK()
 OVER (ORDER BY a.PostalCode) AS 'Dense Rank'


    ,NTILE(4)
 OVER (ORDER BY a.PostalCode) AS 'Quartile'


    ,s.SalesYTD, a.PostalCode

FROM Sales.SalesPerson s 

    INNER JOIN Person.Contact c ON s.SalesPersonID = c.ContactID

    INNER JOIN Person.Address a ON a.AddressID = c.ContactID

WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;
FirstNameLastNameRow NumberRankDense RankQuartileSalesYTDPostalCode
MaciejDusza1111455704598027
ShelleyDyck2111520047598027
LindaEcoffey3111385716498027
CarlaEldridge4111176493998027
CarolElliott5112281101398027
JaunaElson6622301872598055
MichaelEmanuel7622318935698055
TerryEminhizer8623358737898055
GailErickson9623501568298055
MarkErickson10623382795098055
MarthaEspinoza11624193162098055
JanethEsteves12624224120498055
TwannaEvans13624175838698055