ROWNUMBER():不关心行具有相同的值的问题,持续递增,类似于IDENTITY。
RANK():允许行具有相同的值的时候相同的排名,在遇到不同的值得时候重新进行ROWNUMBER()排名。
例如N个相同的值排名为1, 那么在N+1的时候排名采用ROWNUMBER()的值也就是N+1.
DENSE_RANK():允许行具有相同的时候相同的排名,在遇到不同的值得时候采用上次的排名进行+1处理。
例如N个相同的值排名为1,那么在N+1的时候排名 采用上次的排名值也就是N+1.
NTILE(X):这个函数可以说很少使用。几乎是个废柴,看上面的代码就明白了。
SQLServer针对排名函数ROWNUMBER()、RANK()、DENSE_RANK()、NTILE的研究!
USE test;
If EXISTS (SELECT * FROM sys.objects where name = N'EmployeOrdersCount' AND Type In ('S','U'))
DROP TABLE EmployeOrdersCount
Else
Create Table EmployeOrdersCount(
Id int PRIMARY KEY IDENTITY ,
EmployeNo NVARCHAR(50) ,
OrdersCount int ,
)
Insert into EmployeOrdersCount (EmployeNo , OrdersCount)
Values ('100',100),('102',100),('103',100),('104',100),
('105',100),('106',99),('107',99),('108',99),('109',98),
('110',98),('111',97),('112',96),('113',100)
-------------------------------------------------------
SELECT ROW_NUMBER() OVER (ORDER BY OrdersCount desc) AS 'RowNumber',
RANK() OVER (ORDER BY OrdersCount desc) AS 'Rank',
DENSE_RANK() OVER(ORDER BY OrdersCount desc) AS 'Dense_Rank',
NTILE(4) OVER(ORDER BY OrdersCount desc) AS 'Ntile',
EmployeOrdersCount.Id,EmployeOrdersCount.EmployeNo,EmployeOrdersCount.OrdersCount
From EmployeOrdersCount
select * from EmployeOrdersCount
结果:
RowNumber Rank Dense_Rank Ntile Id EmployeNo OrdersCount
1 1 1 1 1 100 100
2 1 1 1 2 102 100
3 1 1 1 3 103 100
4 1 1 1 4 104 100
5 1 1 2 5 105 100
6 1 1 2 13 113 100
7 7 2 2 6 106 99
8 7 2 3 7 107 99
9 7 2 3 8 108 99
10 10 3 3 9 109 98
11 10 3 4 10 110 98
12 12 4 4 11 111 97
13 13 5 4 12 112 96
消息:
(13 row(s) affected)
Tips:多动手写写。。。