分组排序

本文总结一下row_number() over(partition by a order by b desc) rn 用法


1、rownum:伪列,记录结果集的行号,使用rownum进行排序的时候是先对结果集加入伪列rownum然后再进行排序


2、row_number()和rownum差不多,功能更强一点(可以在各个分组内从1开时排序)


3、rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内).


4、dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。相比之下row_number是没有重复值的 .


5、lag(arg1,arg2,arg3): arg1表示表中的任意字段或者表单式 
arg2表示一个往回检索以前的行的数目,或者可以理解为某一行行号
arg3表示0到arg2行所显示的值


insert into test(id,province,city,code) values(1,'河北省','唐山市','100');
insert into test(id,province,city,code) values(2,'河北省','石家庄市','101');
insert into test(id,province,city,code) values(3,'河北省','秦皇岛市','102');
insert into test(id,province,city,code) values(4,'河北省','秦皇岛市','102');
insert into test(id,province,city,code) values(5,'河北省','保定市','103');
insert into test(id,province,city,code) values(6,'河北省','张家口市','104');




insert into test(id,province,city,code) values(7,'山东省','青岛市','200');
insert into test(id,province,city,code) values(8,'山东省','大连市','201');
insert into test(id,province,city,code) values(9,'山东省','济南市','202');






语句一、select rownum rownumber,t.* from test t order by t.code;


1 1 河北省 唐山市 100
2 2 河北省 石家庄市 101
3 3 河北省 秦皇岛市 102
4 4 河北省 秦皇岛市 102
5 5 河北省 保定市 103
6 6 河北省 张家口市 104
7 7 山东省 青岛市 200
8 8 山东省 大连市 201
9 9 山东省 济南市 202


语句二、select t.province,t.city,t.code,row_number() over(order by t.code) as rownumber from test t;


河北省 唐山市 100 1
河北省 石家庄市 101 2
河北省 秦皇岛市 102 3
河北省 秦皇岛市 102 4
河北省 保定市 103 5
河北省 张家口市 104 6
山东省 青岛市 200 7
山东省 大连市 201 8
山东省 济南市 202 9


两者达到的效果是一样的


语句三、(分组排序、唯一)select t.province,t.city,t.code,row_number() over(partition by t.province order by t.code) as rownumber from test t;


山东省 青岛市 200 1
山东省 大连市 201 2
山东省 济南市 202 3
河北省 唐山市 100 1
河北省 石家庄市 101 2
河北省 秦皇岛市 102 3
河北省 秦皇岛市 102 4
河北省 保定市 103 5
河北省 张家口市 104 6


语句四、(分组排序、重复、跳跃)select t.province,t.city,t.code,rank() over(partition by t.province order by t.code) as rownumber from test t;


山东省 青岛市 200 1
山东省 大连市 201 2
山东省 济南市 202 3
河北省 唐山市 100 1
河北省 石家庄市 101 2
河北省 秦皇岛市 102 3
河北省 秦皇岛市 102 3
河北省 保定市 103 5
河北省 张家口市 104 6


语句五、(分组排序、重复、连续)select t.province,t.city,t.code,dense_rank() over(partition by t.province order by t.code) as rownumber from test t;


山东省 青岛市 200 1
山东省 大连市 201 2
山东省 济南市 202 3
河北省 唐山市 100 1
河北省 石家庄市 101 2
河北省 秦皇岛市 102 3
河北省 秦皇岛市 102 3
河北省 保定市 103 4
河北省 张家口市 104 5


语句六、(分组排序、替换当前行号)select t.province,t.city,t.code,lag(t.city,2,'城市被替换了==========') over(partition by t.province order by t.code) as rownumber from test t;


山东省 青岛市 200 城市被替换了==========
山东省 大连市 201 城市被替换了==========
山东省 济南市 202 青岛市
河北省 唐山市 100 城市被替换了==========
河北省 石家庄市 101 城市被替换了==========
河北省 秦皇岛市 102 唐山市
河北省 秦皇岛市 102 石家庄市
河北省 保定市 103 秦皇岛市
河北省 张家口市 104 秦皇岛市


本文转载自:http://www.blogjava.net/kxbin/articles/360195.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值