一段比较巧妙的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
方法一: 引用自 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相关推荐
- oracle号码段拆开,学习-SQL查询连续号码段的巧妙解法
学习-SQL查询连续号码段的巧妙解法 在ITPUB上有一则非常巧妙的SQL技巧,学习一下,记录在这里. 最初的问题是这样的:我有一个表结构, fphm,kshm 2014,00000001 2014, ...
- 五十种巧妙优化SQL Server数据库
五十种巧妙优化SQL Server数据库的方法:出现性能问题的原因- 没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷). I/O吞吐量小,形成了瓶颈效应. 没有创建计算列导致查询不 ...
- 50种方法巧妙优化SQL Server数据库(转载)
50种方法巧妙优化SQL Server数据库 查询速度慢的原因很多,常见如下几种: 1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2.I/O吞吐量小,形成了瓶颈效应. 3. ...
- access labsql 出错_一段由ACCESS转为SQL SERVER后出现的CINT错误
你的位置: 问答吧 -> 网络编程 -> 问题详情 一段由ACCESS转为SQL SERVER后出现的CINT错误 Public Function getLevel (User_List, ...
- 学习-SQL查询连续号码段的巧妙解法--转载
原文地址:http://www.eygle.com/archives/2006/09/sql_tips.html 我有一个表结构, fphm,kshm 2014,00000001 2014,00000 ...
- mysql编辑前200行_巧妙使用SQL Server编辑前200行功能
在SQL Server 2005/2008/2008 R2中,我们可以使用SQL Server自带的编辑前200行功能,使用这个功能的本意是简化Update 的使用,让开发人员.DBA和不懂T-SQL ...
- 【转载】用Snort巧妙检测SQL注入和跨站脚本攻击
脚本攻击是最近网络上最疯狂的攻击方法了,很多服务器配置了先进的硬件防火墙.多层次的安全体系,可惜最后对80端口的SQL注入和跨站脚本攻击还是没有办法抵御,只能看着数据被恶意入侵者改的面目全非而毫无办法 ...
- 利用ajax,巧妙的sql语句组合,轻松做出不错的树型菜单
我们的某个项目中,在设计报表时候,考虑到做报表的树型分类,同时考虑到分类下存在子分类和报表并存,使用原有项目中jtree功能已经达不到这要求,因此,考虑蛮久,还是自己写一个吧. 注意: 前提需知: 本 ...
- mysql 看表字段的备注,使用SQL查询表字段列的备注信息
使用SQL查询表字段列的备注信息 用下面的视图: SQL> desc user_col_comments; Name Null? Ty ...
- oracle查询号段是否重复,ORACLE SQL: 查询连续号码段并合并的方法
有一个表phonearea,结构如下: province prefix 2014 00000001 2014 00000002 2014 00000003 20 ...
最新文章
- 一次excel的countifs的成功应用
- STL源码剖析---红黑树原理详解
- 夏意秋尽-08年1月
- 实现Java集合迭代的高性能
- 5g与edge ai_使用OpenVINO部署AI Edge应用
- android之多媒体篇(一)
- C++之继承探究(二):protected成员
- 使用BULK COLLECT+FORALL加速批量提交
- oraclemt 无法启动服务_调整MT后台 解决站点压力问题
- Linux centos7系统下JBoss7.1的部署安装
- Ubuntu安装Mysql5.7
- java se 试题_JavaSE基础试题附答案
- MySql 数据库10038问题终极解决
- 魏兴国:深入浅出DDoS攻击防御
- 《职业形象与商务礼仪》
- HDU 1290:献给杭电五十周年校庆的礼物
- oracle分区设计,​Oracle 分区
- USB2.0、USB3.0和typec引脚定义
- 2022前端面试宝典(初级简洁版)
- 亚美尼亚副总理代表团造访清微智能
热门文章
- uniapp压缩图片
- 科研常用到的计算机编程,科研必备:几款好用的流程图工具,助力你的论文/科研绘图...
- html5在线聊天插件,纯js网页在线聊天对话插件(原创)
- 软件工程知识点总结——第一、二部分
- vscode跳转返回快捷键
- 【Java工具类】中文转换成汉语拼音工具-pinyin4j
- 【FlinkX】两个issue分析:reader和writer的通道数不一致+获取JobId
- python国外文献_python的英文文献
- 【ARM嵌入式】——多寄存器寻址
- Django文档学习