实际应用中,经常会碰到连续号码断号的问题,如何根据已有号码,分段显示出来?原理简单,首先根据“号码”排序,然后再根据“号码-排序号”分组,再根据分组结果求组内的最大和最小值,就能产生分组号段了。
例:
有张表,数据如下:
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博客 ” ,链接:https://blog.itpub.net/21251711/viewspace-1074613/
,如需转载,请注明出处,否则将追究法律责任。