SQL2005中row_number()等函數的用法
2005比2000新增了幾個函數,分別是row_number()、rank()、dense_rank()、ntile(),下面以實例分別簡單講解一下。

1 create table gg(sname varchar ( 10 ),sort varchar ( 10 ),num int )
2 ? go
3
4 ? insert into gg
5 ? select ' 白芍 ' , ' 根莖類 ' , 55
6 ? union all
7 ? select ' 法半夏 ' , ' 根莖類 ' , 78
8 ? union all
9 ? select ' 柴胡 ' , ' 根莖類 ' , 60
10 union all
11 select ' 川芎 ' , ' 根莖類 ' , 99
12 union all
13 select ' 天香爐 ' , ' 草類 ' , 68
14 union all
15 select ' 燈心草 ' , ' 草類 ' , 55
16 union all
17 select ' 龍葵 ' , ' 草類 ' , 60
18 union all
19 select ' 石見穿 ' , ' 草類 ' , 60
20 union all
21 select ' 豬籠草 ' , ' 草類 ' , 70
22 union all
23 select ' 益母草 ' , ' 草類 ' , 86
24 union all
25 select ' 扁豆 ' , ' 果實類 ' , 86
26 union all
27 select ' 草果 ' , ' 果實類 ' , 70
28 union all
29 select ' 金櫻子 ' , ' 果實類 ' , 55
30 union all
31 select ' 女貞子 ' , ' 果實類 ' , 94
32 union all
33 select ' 胖大海 ' , ' 果實類 ' , 66
34 union all
35 select ' 桑葚 ' , ' 果實類 ' , 78
36
37 select sname,sort,num,
38 row_number() over ( order by num) as rownum,
39 rank() over ( order by num) as ranknum,
40 dense_rank() over ( order by num) as dersenum,
41 ntile( 3 ) over ( order by num) as ntilenum
42 from gg
43
--結果
--ROW_NUMBER()是按num由小到大逐一排名,不并列,排名連續
--RANK()是按num由小到大逐一排名,并列,排名不連續
--DENSE_RANK()是按num由小到大逐一排名,并列,排名連續
--NTILE()是按num由小到大分成組逐一排名,并列,排名連續
sname????? sort?????? num?????? rownum??????? ranknum?????? dersenum?????? ntilenum
-------- --------- --------- ------------- ------------- --------------- ---------------
白芍???????? 根莖類?????? 55????????? 1???????? ? 1??????????? ? 1?????????????? 1
燈心草?????? 草類???????? 55????????? 2????? ???? 1????????? ??? 1?????????????? 1
金櫻子?????? 果實類?????? 55????????? 3?????? ??? 1???????? ???? 1????????????? ? 1
龍葵???????? 草類???????? 60????????? 4??????? ?? 4????????? ??? 2???????????? ?? 1
石見穿?????? 草類???????? 60????????? 5?? ??????? 4??????????? ? 2???????????? ?? 1
柴胡???????? 根莖類?????? 60????????? 6???????? ? 4???????????? 2???????????? ?? 1
胖大海?????? 果實類?????? 66????????? 7??????? ?? 7??????????? ? 3???????????? ?? 2
天香爐?????? 草類???????? 68????????? 8????????? 8???????????? 4????????????? ? 2
草果???????? 果實類?????? 70????????? 9????????? 9???????????? 5?????????????? 2
豬籠草?????? 草類???????? 70????????? 10???????? 9??????????? ? 5?????????????? 2
法半夏?????? 根莖類?????? 78????????? 11???????? 11????????? ?? 6????????????? ? 2
桑葚???????? 果實類?????? 78????????? 12???????? 11?????????? ? 6?????????????? 3
益母草?????? 草類???????? 86????????? 13???????? 13??????????? 7????????????? ? 3
扁豆???????? 果實類?????? 86????????? 14???????? 13??????????? 7????????????? ? 3
女貞子?????? 果實類?????? 94????????? 15???????? 15?????????? ? 8????????????? ? 3
川芎???????? 根莖類?????? 99????????? 16???????? 16??????????? 9????????????? ? 3
(16 行受影響)

select sname,sort,num,
row_number() over (partition by sort order by num) as rownum,
rank() over (partition by sort order by num) as ranknum,
dense_rank() over (partition by sort order by num) as dersenum,
ntile( 3 ) over (partition by sort order by num) as ntilenum
from gg
--結果
此時加了partition by sort,就以類別來分類了,ntile(3)意思就是強制分為三組。
sname????? sort?????????? num?????? rownum??????? ranknum??????? dersenum?????? ntilenum
-------- ----------?? --------- ------------- --------------- ---------------- -----------
燈心草?????? 草類????????? 55????????? 1??????????? 1?????????????? 1?????????????? 1
龍葵???????? 草類????????? 60????????? 2??????????? 2?????????????? 2?????????????? 1
石見穿?????? 草類????????? 60????????? 3??????????? 2?????????????? 2?????????????? 2
天香爐?????? 草類????????? 68????????? 4??????????? 4?????????????? 3?????????????? 2
豬籠草?????? 草類????????? 70????????? 5??????????? 5?????????????? 4?????????????? 3
益母草?????? 草類????????? 86????????? 6??????????? 6?????????????? 5?????????????? 3
白芍???????? 根莖類??????? 55????????? 1??????????? 1?????????????? 1?????????????? 1
柴胡???????? 根莖類??????? 60????????? 2??????????? 2?????????????? 2?????????????? 1
法半夏?????? 根莖類??????? 78????????? 3??????????? 3?????????????? 3?????????????? 2
川芎???????? 根莖類??????? 99????????? 4??????????? 4?????????????? 4?????????????? 3
金櫻子?????? 果實類??????? 55????????? 1??????????? 1?????????????? 1?????????????? 1
胖大海?????? 果實類??????? 66????????? 2??????????? 2?????????????? 2?????????????? 1
草果???????? 果實類??????? 70????????? 3??????????? 3?????????????? 3?????????????? 2
桑葚???????? 果實類??????? 78????????? 4??????????? 4?????????????? 4?????????????? 2
扁豆???????? 果實類??????? 86????????? 5??????????? 5?????????????? 5?????????????? 3
女貞子?????? 果實類??????? 94????????? 6??????????? 6?????????????? 6?????????????? 3
(16 行受影響)
下面分別用SQL 2000實現,相對比2005要麻煩的多了。
--ROW_NUMBER在sql 2000中的實現
--利用臨時表和IDENTITY(函數)

1 select sname,num, identity ( int , 1 , 1 ) as rownumber
2 into #tem
3 from gg
4 order by num
5
6 select sname,num,rownumber
7 from #tem
8
9 drop table #tem
10 go
11
12 -- RANK在sql 2000中的實現
13 select sname,num,
14 ( select count ( 1 ) + 1 from gg where num < g.num) as ranknum
15 from gg g
16 order by num
17 go
18
19 -- DENSE_RANK在sql 2000中的實現
20 select num, identity ( int , 1 , 1 ) as densenum
21 into #t
22 from gg
23 group by num
24 order by num
25
26 select r.sname,r.num,t.densenum
27 from gg r join #t t
28 on r.num = t.num
29 order by num
30
31 drop table #t
32 go
33
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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