oracle号码段拆开,学习-SQL查询连续号码段的巧妙解法

学习-SQL查询连续号码段的巧妙解法

6ee5639a40442445944d63b514b2dd02.png

在ITPUB上有一则非常巧妙的SQL技巧,学习一下,记录在这里。

最初的问题是这样的:我有一个表结构,

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

ITPUB上的朋友给出了一个非常巧妙的答案:SQL> SELECT b.fphm, MIN (b.kshm) Start_HM, MAX (b.kshm) End_HM

2 FROM (SELECT a.*, TO_NUMBER (a.kshm - ROWNUM) cc

3 FROM (SELECT *

4 FROM t

5 ORDER BY fphm, kshm) a) b

6 GROUP BY b.fphm, b.cc

7 /

FPHM START_HM END_HM

---------- -------- --------

2013 00000120 00000122

2013 00000124 00000125

2014 00000001 00000005

2014 00000007 00000009

-The End-

By eygle on 2006-09-26 15:04 |

Comments (10) |

SQL.PLSQL | 916 |

10 Comments

当数据列比较大时,行号就好像不管用了

当数据列比较大时,行号就好像不管用了

有重复的数据就不管用了,比如有两行2014,00000005。

用到的方法很简单 但是确实很使用 很精妙 不过严谨一点还应该给subquery进行asc排序。

--用分析函数也可以,主要是要构造出一个序列做差统一分组:

with t as

(

select'2014' fphm, '00000001' kshm from dual union all

select'2014' fphm, '00000002' kshm from dual union all

select'2014' fphm, '00000003' kshm from dual union all

select'2014' fphm, '00000004' kshm from dual union all

select'2014' fphm, '00000005' kshm from dual union all

select'2014' fphm, '00000007' kshm from dual union all

select'2014' fphm, '00000008' kshm from dual union all

select'2014' fphm, '00000009' kshm from dual union all

select'2013' fphm, '00000120' kshm from dual union all

select'2013' fphm, '00000121' kshm from dual union all

select'2013' fphm, '00000122' kshm from dual union all

select'2013' fphm, '00000124' kshm from dual union all

select'2013' fphm, '00000125' kshm from dual

)

select fphm, min(kshm), max(kshm)

from (select t.*, row_number() over(partition by fphm order by kshm) rn from t)

group by fphm,to_number(kshm-rn);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值