分組查詢連線號段

pwz1688發表於2014-01-23
實際應用中,經常會碰到連續號碼斷號的問題,如何根據已有號碼,分段顯示出來?原理簡單,首先根據“號碼”排序,然後再根據“號碼-排序號”分組,再根據分組結果求組內的最大和最小值,就能產生分組號段了。
例:
有張表,資料如下:
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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章