?
??? ?相信大家在軟件工程中經常會遇到對某些數據進行排名的問題,尤其是對于電子商務的HR來說“大手筆”是非常具有潛在價值的!~至于都有哪些價值這個超出本文的范疇不予進行說明,但是不得不說的是每一個精明的HR以下類似的需求:
????
- 我需要系統告訴我,截止到目前為止,近幾個月內銷售人員的訂單交易數量排名、獎金排名(對內部員工員工)
- 我需要系統告訴我,截止到目前為止,商品熱度的排名、購買力度的排名、充值力度的排名、提款力度的排名,相關地區的的排名(對客戶)
?
??? ?對于SQL新人來說,第一個想到的函數 TOP 配合 ROW_NUMBER() 、 ORDER BY ,如果你用了這3個配合,那么恭喜你, You're?Wrong!?
?????因為上述的情況,可能會發生相同數據的排名,那么一旦排名的數據發生相同,因為 ROWNUMBER() 類似于 IDENTITY (起始1,自增1)所以對排名的準確性就不那么明確了。??
??? 下面來看具體的例子:
????基礎數據準備:
?
/*
以下代碼執行完成只是為了講解說明,執行完成需要刷新下IntelliSence緩存,更新下當前智能提示 *鍵盤快捷鍵 Ctrl+Shift+R。 *@author 系統管理員-咔咔 *@time 2013-11-25
*/
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)
:這個函數可以說很少使用。幾乎是個廢柴,看上面的代碼就明白了。
???
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

