row_number()、rank()、dense_rank()、ntile()

SQL2005中row_number()等函数的用法

2005比2000新增了几个函数,分别是row_number()、rank()、dense_rank()、ntile(),下面以实例分别简单讲解一下。

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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 行受影响)

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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(函数)

ContractedBlock.gif ExpandedBlockStart.gif 代码
 
   
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

转载于:https://www.cnblogs.com/weiqt/articles/1848536.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值