ITPub博客

首页 > 数据库 > Oracle > 分组查询连接号段

分组查询连接号段

原创 Oracle 作者:pwz1688 时间:2014-01-23 16:34:27 0 删除 编辑
实际应用中,经常会碰到连续号码断号的问题,如何根据已有号码,分段显示出来?原理简单,首先根据“号码”排序,然后再根据“号码-排序号”分组,再根据分组结果求组内的最大和最小值,就能产生分组号段了。
例:
有张表,数据如下:
fphm,kshm
2014,00000001
2014,00000002
2014,00000003
2014,00000004
2014,00000005
2014,00000007
2014,00000008
2014,00000009
2013,00000120
2013,00000121
2013,00000122
2013,00000124
2013,00000125
要求出下例结果
2014,00000001,00000005
2014,00000009,00000007
2013,00000120,00000122
2013,00000124,00000125
建表语句及数据初始化脚本如下:
SQL> create table t(fphm varchar2(4),kshm varchar2(8));
表已创建。
SQL> insert into t values('2014','00000001');
已创建 1 行。
SQL> insert into t values('2014','00000002');
已创建 1 行。
SQL> insert into t values('2014','00000003');
已创建 1 行。
SQL> insert into t values('2014','00000004');
已创建 1 行。
SQL> insert into t values('2014','00000005');
已创建 1 行。
SQL> insert into t values('2014','00000007');
已创建 1 行。
SQL> insert into t values('2014','00000008');
已创建 1 行。
SQL> insert into t values('2014','00000009');
已创建 1 行。
SQL> insert into t values('2013','00000120');
已创建 1 行。
SQL> insert into t values('2013','00000121');
已创建 1 行。
SQL> insert into t values('2013','00000122');
已创建 1 行。
SQL> insert into t values('2013','00000124');
已创建 1 行。
SQL> insert into t values('2013','00000125');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
FPHM KSHM
---- --------
2014 00000001
2014 00000002
2014 00000003
2014 00000004
2014 00000005
2014 00000007
2014 00000008
2014 00000009
2013 00000120
2013 00000121
2013 00000122


FPHM KSHM
---- --------
2013 00000124
2013 00000125
已选择13行。
方法一:原始方法
SQL> edit
已写入 file afiedt.buf


  1  select b.fphm,min(b.kshm),max(b.kshm) from
  2  (select a.*,to_number(kshm-rownum) cc from (select * from t order by fphm,kshm) a)b
  3* group by b.fphm,b.cc
SQL> /


FPHM MIN(B.KS MAX(B.KS
---- -------- --------
2013 00000120 00000122
2013 00000124 00000125
2014 00000001 00000005
2014 00000007 00000009

方法二:分析函数 partition by
SQL> edit
已写入 file afiedt.buf


  1  select a.fphm,min(kshm),max(kshm) from
  2  (select t.*,t.kshm-row_number() over(partition by fphm order by kshm) rn from t) a
  3* group by a.fphm,a.rn
SQL> /


FPHM MIN(KSHM MAX(KSHM
---- -------- --------
2014 00000007 00000009
2013 00000120 00000122
2013 00000124 00000125
2014 00000001 00000005
方法三:利用group by 号码-排序号
SQL> select max(fphm),min(kshm),max(kshm)
  2  from t
  3  group by fphm||kshm-rownum;


MAX( MIN(KSHM MAX(KSHM
---- -------- --------
2013 00000120 00000122
2014 00000001 00000005
2014 00000007 00000009
2013 00000124 00000125

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21251711/viewspace-1074613/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-30

  • 博文量
    106
  • 访问量
    662440