• ----:)欢迎访问源码网(:----
    • 首页
    • 博客
    • 学院
    • 下载
    • 论坛
    • 影视
    • 发布源码
    • RSS
    • ITPig
    • 笑话网
    • 百家姓
    • 繁體中文

源码网 - 中国第一源码门户
选择镜像:网通镜像 - 电信主站
  • 首 页
  • 新闻动态
  • 网站运营
  • 网页制作
  • WEB开发
  • 编程开发
  • 图像媒体
  • 操作系统
  • 数据库
  • 服务器
热门搜索 优化 SEO 故事 cms IIS7 MySQL 个人 AdSense 主题推广 | 文章搜索: 高级搜索
会员登录/控制面版您的位置: 学院首页 >> 数据库 >> Oracle >> 详细内容
 

推荐文章

 
 

热点文章

  • Oracle PL/SQL语言入门
  • Oracle SOA Suite预览尝鲜
  • OracleOracle安全数据系统架构全接触(11
  • Oracle是关系型数据库管理系统,它功能强大、性能卓越..
  • 搭建Oracle高可用数据库环境(1)
  • oracle易忘函数用法(1)
  • 两种Oracle应用程序开发接口的对比分析(1)
  • ORACLE学习笔记--性能优化
  • 诊断Oraacle数据库Hanging问题(1)
  • Oracle中捕获问题SQL解决CPU过渡消耗(1)
  • Oracle数据仓库查询优化技术(1)
  • Oracle常见等待事件说明(1)
 
 

相关文章

 
 

百度搜索

 
 

Oracle层次查询和分析函数在号段选取中的应用(1)

  • 阅览次数:
  • 文章来源: cp整理
  • 原文作者: 不详
  • 整理日期: 2007-03-29
  • 发表评论
  • 字体大小:
  • 小
  • 中
  • 大

1. 问题的提出

在实际工作中,我们常常会碰到号段选取的问题。

(1)一组连续的数,去掉中间一些数,要求出剩下的数的区间(即号段)。

例如:一串数字为1,2,3,4,7,9,10,则号段为1-4,7-7,9-10

(2)知道号段的起止,要求出该号段内所有的数。

例如:号段为1-3,15-15,则号段内所有的数为1,2,3,15 

(3)一组数,中间可能有断点,要求出缺失的数。

例如:一串数字为1,2,3,4,7,9,10,则缺失的数为5,6,8 

(4)已知大号段范围及已用号段范围,求可用号段范围。

例如:大号段范围0-999,已用号段范围0-200,399-599,则可用号段范围为201-398,600-999

2. 基础知识

先做下热身运动,回顾一下层次查询和lead/lag函数的运用。

2.1 伪列rownum和level

伪列就是并非在表中真正存在的列。已有很多资料介绍rownum和level这两个伪列。这里只想强调一点,伪列是只针对结果集的。

2.2 利用层次查询构造连续的数 

产生5~8这4个连续的数:

select * from (select rownum+4 from dual connect by rownum<5);

select * from (select level+4 from dual connect by level<5); 

以8月为界,例如2005年8月1日,之前的在校学生入学年份为2001~2004,之后的为2002~2005。求当前日期下的在校学生入学年份:

select * from (select to_char(add_months(sysdate, 4), 'yyyy')

- rownum from dual connect by rownum<5);

2.3 用分析函数Lead和Lag获得相邻行的字段值

select rn, lag(rn)over(order by rn) previos,

lead(rn)over(order by rn) next from (select rownum+4 rn from dual connect by rownum<5);

RN PREVIOS NEXT

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

5 6

6 5 7

7 6 8

8 7



简单的说,在这里,Lag是获得前一行的内容,而Lead是获得后一行的内容。

select rn, lag(rn,2,-1)over(order by rn) previos,

lead(rn,2,-1) over(order by rn) next from

(select rownum+4 rn from dual connect by rownum<5);

RN PREVIOS NEXT

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

5 -1 7

6 -1 8

7 5 -1

8 6 -1

这里,通过指定offset参数来获得两行前的内容和两行后的内容,如果offset超出范围并且未设定默认值-1,那么系统会自动将其值设为NULL。

3. 问题的解决

有了基础知识的积累,我们就可以解决前面提到的问题。

3.1 已知号码求号段

3.1.1 题例

我有一个表结构,

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

[1] [2]

上一篇:PHP使用zlib扩展实现页面GZIP压缩输出
下一篇:构建支持Master/Slave读写分离的数据库操作类
  • 网友评论:
  • 查看所有评论
  • 我要发表评论
您的网名:
留言主题:
你要发表的内容:

 

关于本站 | 广告联系 | 版权声明 | 网站地图 | 发布软件 | 帮助中心 | 源码论坛

Copyright © 2005-2007 CodePub.Com  程序支持:木翼  滇ICP备05005971号