?
??? ?相信大家在軟件工程中經(jīng)常會遇到對某些數(shù)據(jù)進(jìn)行排名的問題,尤其是對于電子商務(wù)的HR來說“大手筆”是非常具有潛在價值的!~至于都有哪些價值這個超出本文的范疇不予進(jìn)行說明,但是不得不說的是每一個精明的HR以下類似的需求:
????
- 我需要系統(tǒng)告訴我,截止到目前為止,近幾個月內(nèi)銷售人員的訂單交易數(shù)量排名、獎金排名(對內(nèi)部員工員工)
- 我需要系統(tǒng)告訴我,截止到目前為止,商品熱度的排名、購買力度的排名、充值力度的排名、提款力度的排名,相關(guān)地區(qū)的的排名(對客戶)
?
??? ?對于SQL新人來說,第一個想到的函數(shù) TOP 配合 ROW_NUMBER() 、 ORDER BY ,如果你用了這3個配合,那么恭喜你, You're?Wrong!?
?????因為上述的情況,可能會發(fā)生相同數(shù)據(jù)的排名,那么一旦排名的數(shù)據(jù)發(fā)生相同,因為 ROWNUMBER() 類似于 IDENTITY (起始1,自增1)所以對排名的準(zhǔn)確性就不那么明確了。??
??? 下面來看具體的例子:
????基礎(chǔ)數(shù)據(jù)準(zhǔn)備:
?
/*
以下代碼執(zhí)行完成只是為了講解說明,執(zhí)行完成需要刷新下IntelliSence緩存,更新下當(dāng)前智能提示 *鍵盤快捷鍵 Ctrl+Shift+R。 *@author 系統(tǒng)管理員-咔咔 *@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
--
員工訂單統(tǒng)計
( Id
INT
PRIMARY
KEY
IDENTITY
,
--
主鍵ID
EmployeNO
NVARCHAR
(
15
),
--
員工編號
OrdersCount
INT
,
--
訂單數(shù)量
)
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
)
? 執(zhí)行命令:
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
?結(jié)果如下:
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 行受影響)
? 結(jié)論如下:?
ROWNUMBER(): 不關(guān)心行具有相同的值的問題,持續(xù)遞增,類似于 IDENTITY 。 RANK(): 允許行具有相同的值的時候相同的排名,在遇到不同的值得時候重新進(jìn)行 ROWNUMBER() 排名。 例如N個相同的值排名為1, 那么在N +1的時候排名采用 ROWNUMBER() 的值也就是N+ 1 . DENSE_RANK(): 允許行具有相同的時候相同的排名,在遇到不同的值得時候采用上次的排名進(jìn)行 + 1處理。 例如N個相同的值排名為1,那么在N +1的時候排名 采用上次的排名值也就是N+ 1 . NTILE(X) :這個函數(shù)可以說很少使用。幾乎是個廢柴,看上面的代碼就明白了。
???
SQLServer針對排名函數(shù)ROWNUMBER()、RANK()、DENSE_RANK()、NTILE的研究!~
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
