USE MyDB;
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,--主键ID
EmployeNO NVARCHAR(15),
--员工编号
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'
,EmployeNO, OrdersCount
FROM EmployeOrdersCount
RowNumber
Rank
Dense_rank
ntile
EmployeNO
OrdersCount
-------------------- -------------------- -------------------- -------------------- --------------- -----------
1
1
1
1
100
100
2
1
1
1
102
100
3
1
1
1
103
100
4
1
1
1
104
100
5
1
1
2
105
100
6
1
1
2
113
100
7
7
2
2
106
99
8
7
2
3
107
99
9
7
2
3
108
99
10
10
3
3
109
98
11
10
3
4
110
98
12
12
4
4
111
97
13
13
5
4
112
96
(13 行受影响)
ROWNUMBER():不关心行具有相同的值的问题,持续递增,类似于IDENTITY。
RANK():允许行具有相同的值的时候相同的排名,在遇到不同的值得时候重新进行ROWNUMBER()排名。
例如N个相同的值排名为1, 那么在N+1的时候排名采用ROWNUMBER()的值也就是N+1.
DENSE_RANK():允许行具有相同的时候相同的排名,在遇到不同的值得时候采用上次的排名进行+1处理。
例如N个相同的值排名为1,那么在N+1的时候排名 采用上次的排名值也就是N+1.
NTILE(X):这个函数可以说很少使用。几乎是个废柴,看上面的代码就明白了。
IF EXISTS (Select * From sys.objects Where name =N'EmployeOrdersCount' And Type In ('S','U'))
ELSE
SELECT ROW_NUMBER() OVER(ORDER BY OrdersCount desc) AS 'RowNumber',
RowNumber
-------------------- -------------------- -------------------- -------------------- --------------- -----------
1
2
3
4
5
6
7
8
9
10
11
12
13
(13 行受影响)
ROWNUMBER():不关心行具有相同的值的问题,持续递增,类似于IDENTITY。
RANK():允许行具有相同的值的时候相同的排名,在遇到不同的值得时候重新进行ROWNUMBER()排名。
DENSE_RANK():允许行具有相同的时候相同的排名,在遇到不同的值得时候采用上次的排名进行+1处理。
NTILE(X):这个函数可以说很少使用。几乎是个废柴,看上面的代码就明白了。