有一个表结构,
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

方法一: 引用自 hmxxyy.

SQL> select * from gap;

ID SEQ
---------- ----------
1 1
1 4
1 5
1 8
2 1
2 2
2 9

select res1.id, res2.seq str, res1.seq end
from (
select rownum rn, c.*
from (
select *
from gap a
where not exists (
select null from gap b where b.id = a.id and a.seq = b.seq - 1
)
order by id, seq
) c
) res1, (
select rownum rn, d.*
from (
select *
from gap a
where not exists (
select null from gap b where b.id = a.id and a.seq = b.seq + 1
)
order by id, seq
) d
) res2
where res1.id = res2.id
and res1.rn = res2.rn
/

ID STR END
--------- ---------- ----------
1 1 1
1 4 5
1 8 8
2 1 2
2 9 9

方法二: 使用lag/lead分析函数进行处理.. 楼上的方法确实挺好用就是觉得表扫描/表连接比较多, 可能数据量大了. 速度会比较慢, 当然我的这种方法由于使用分析函数使用的比较频繁.所以排序量可能比上一种要多..

SQL> select fphm,lpad(kshm,8,'0') kshm
2  from t
3  /

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 rows selected.

SQL> set echo on
SQL> @bbb.sql
SQL> select fphm,lpad(kshm,8,'0') start_kshm,lpad(prev_prev_kshm,8,'0') end_kshm
2  from (
3    select fphm,kshm,next_kshm,prev_kshm,
4    lag(kshm,1,null) over (partition by fphm order by kshm )next_next_kshm,
5    lead(kshm,1,null) over (partition by fphm order by kshm ) prev_prev_kshm
6    from (
7    select *
8    from (
9      select fphm,kshm,
10           lead(kshm,1,null) over (partition by fphm order by kshm) next_kshm,
11           lag(kshm,1,null) over (partition by fphm order by kshm) prev_kshm
12         from t
13       )
14       where ( next_kshm - kshm <> 1 or kshm - prev_kshm <> 1 )
15       or ( next_kshm is null or prev_kshm is null )
16    )
17  )
18  where next_kshm - kshm = 1
19  /

FPHM START_KSHM       END_KSHM
---------- ---------------- ----------------
2013 00000120         00000122
2013 00000124         00000125
2014 00000001         00000005
2014 00000007         00000009                                            

SQL> spool off

方法三: 今天早上wildflower 给了我这个答案, 顿时觉得耳目一新啊..就贴出来与大家一起共享了^_^.

SQL> spool aaa.log
SQL> set echo on
SQL> select * from t;

no rows selected

SQL> select * from t;

FPHM       KSHM
---------- ----------
2014          1
2014          2
2014          3
2014          4
2014          5
2014          7
2014          8
2014          9
2013        120
2013        121
2013        122

FPHM       KSHM
---------- ----------
2013        124
2013        125

13 rows selected.

SQL> @bbb.sql
SQL> select b.fphm,min(b.kshm),max(b.kshm)
2  from (
3          select a.*,to_number(a.kshm-rownum) cc
4          from (
5                  select * from t order by fphm,kshm
6          ) a
7  )  b
8  group by b.fphm,b.cc
9  /

FPHM MIN(B.KSHM) MAX(B.KSHM)
---------- ----------- -----------
2013         120         122
2013         124         125
2014           1           5
2014           7           9

SQL>

一段比较巧妙的sql相关推荐

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

    学习-SQL查询连续号码段的巧妙解法 在ITPUB上有一则非常巧妙的SQL技巧,学习一下,记录在这里. 最初的问题是这样的:我有一个表结构, fphm,kshm 2014,00000001 2014, ...

  2. 五十种巧妙优化SQL Server数据库

    五十种巧妙优化SQL Server数据库的方法:出现性能问题的原因- 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 没有创建计算列导致查询不 ...

  3. 50种方法巧妙优化SQL Server数据库(转载)

    50种方法巧妙优化SQL Server数据库 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3. ...

  4. access labsql 出错_一段由ACCESS转为SQL SERVER后出现的CINT错误

    你的位置: 问答吧 -> 网络编程 -> 问题详情 一段由ACCESS转为SQL SERVER后出现的CINT错误 Public Function getLevel (User_List, ...

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

    原文地址:http://www.eygle.com/archives/2006/09/sql_tips.html 我有一个表结构, fphm,kshm 2014,00000001 2014,00000 ...

  6. mysql编辑前200行_巧妙使用SQL Server编辑前200行功能

    在SQL Server 2005/2008/2008 R2中,我们可以使用SQL Server自带的编辑前200行功能,使用这个功能的本意是简化Update 的使用,让开发人员.DBA和不懂T-SQL ...

  7. 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击

    脚本攻击是最近网络上最疯狂的攻击方法了,很多服务器配置了先进的硬件防火墙.多层次的安全体系,可惜最后对80端口的SQL注入和跨站脚本攻击还是没有办法抵御,只能看着数据被恶意入侵者改的面目全非而毫无办法 ...

  8. 利用ajax,巧妙的sql语句组合,轻松做出不错的树型菜单

    我们的某个项目中,在设计报表时候,考虑到做报表的树型分类,同时考虑到分类下存在子分类和报表并存,使用原有项目中jtree功能已经达不到这要求,因此,考虑蛮久,还是自己写一个吧. 注意: 前提需知: 本 ...

  9. mysql 看表字段的备注,使用SQL查询表字段列的备注信息

    使用SQL查询表字段列的备注信息 用下面的视图: SQL> desc user_col_comments; Name                            Null?    Ty ...

  10. oracle查询号段是否重复,ORACLE SQL: 查询连续号码段并合并的方法

    有一个表phonearea,结构如下: province   prefix 2014       00000001 2014       00000002 2014       00000003 20 ...

最新文章

  1. 一次excel的countifs的成功应用
  2. STL源码剖析---红黑树原理详解
  3. 夏意秋尽-08年1月
  4. 实现Java集合迭代的高性能
  5. 5g与edge ai_使用OpenVINO部署AI Edge应用
  6. android之多媒体篇(一)
  7. C++之继承探究(二):protected成员
  8. 使用BULK COLLECT+FORALL加速批量提交
  9. oraclemt 无法启动服务_调整MT后台 解决站点压力问题
  10. Linux centos7系统下JBoss7.1的部署安装
  11. Ubuntu安装Mysql5.7
  12. java se 试题_JavaSE基础试题附答案
  13. MySql 数据库10038问题终极解决
  14. 魏兴国:深入浅出DDoS攻击防御
  15. 《职业形象与商务礼仪》
  16. HDU 1290:献给杭电五十周年校庆的礼物
  17. oracle分区设计,​Oracle 分区
  18. USB2.0、USB3.0和typec引脚定义
  19. 2022前端面试宝典(初级简洁版)
  20. 亚美尼亚副总理代表团造访清微智能

热门文章

  1. uniapp压缩图片
  2. 科研常用到的计算机编程,科研必备:几款好用的流程图工具,助力你的论文/科研绘图...
  3. html5在线聊天插件,纯js网页在线聊天对话插件(原创)
  4. 软件工程知识点总结——第一、二部分
  5. vscode跳转返回快捷键
  6. 【Java工具类】中文转换成汉语拼音工具-pinyin4j
  7. 【FlinkX】两个issue分析:reader和writer的通道数不一致+获取JobId
  8. python国外文献_python的英文文献
  9. 【ARM嵌入式】——多寄存器寻址
  10. Django文档学习