当前位置:  数据库>oracle

Oracle连续数据处理示例

    来源: 互联网  发布时间:2017-06-12

    本文导语: 下面这段内容讲解的功能是Oracle数据库中有一张表,表中存储了连续的时间记录,同时对应的还存储了一个标记位。现在要获取一个结果集:当标记位为0时,取前一个为1的时间数据,如果标记位为1时,取当前记录的时间数据。...

下面这段内容讲解的功能是Oracle数据库中有一张表,表中存储了连续的时间记录,同时对应的还存储了一个标记位。现在要获取一个结果集:当标记位为0时,取前一个为1的时间数据,如果标记位为1时,取当前记录的时间数据。

先上干货。再解释

1、建表

create table test_date(
  t_TIME varchar(20),  --时间
  t_ISOM number default 0  --标记
)

2、初始化数据

DELETE FROM test_date;
insert into test_date(t_TIME,t_ISOM) values('20140101',1);
insert into test_date(t_TIME,t_ISOM) values('20140102',0);
insert into test_date(t_TIME,t_ISOM) values('20140103',0);
insert into test_date(t_TIME,t_ISOM) values('20140104',0);
insert into test_date(t_TIME,t_ISOM) values('20140105',0);
insert into test_date(t_TIME,t_ISOM) values('20140106',0);
insert into test_date(t_TIME,t_ISOM) values('20140107',0);
insert into test_date(t_TIME,t_ISOM) values('20140108',1);
insert into test_date(t_TIME,t_ISOM) values('20140109',1);
insert into test_date(t_TIME,t_ISOM) values('20140110',0);
insert into test_date(t_TIME,t_ISOM) values('20140111',1);
insert into test_date(t_TIME,t_ISOM) values('20140112',0);
insert into test_date(t_TIME,t_ISOM) values('20140113',0);
insert into test_date(t_TIME,t_ISOM) values('20140114',1);

3、获取结果数据

select
  case when T_ISOM=1 THEN T_TIME
  ELSE
      N
  END RESULT_TIME  --要的结果,comment by danielinbiti
  ,C.*
FROM
(
SELECT B.*,(M-B.T_TIME) AS M_D,(B.T_TIME-N) AS N_D FROM
(
  SELECT A.*,MAX(DNEXT) OVER(PARTITION BY x) AS M,MIN(DPRE) OVER(PARTITION BY x) AS N FROM
  (
    SELECT t_TIME,t_ISOM,ROW_NUMBER() OVER(ORDER BY t_TIME)-ROW_NUMBER() OVER(PARTITION BY t_ISOM ORDER BY t_TIME) x
    ,Lead(t_TIME)  over(order by t_TIME) as dnext,lag(t_TIME)  over(order by t_TIME) as dpre
          FROM test_date
  ) A order by t_time
) B
) c order by t_time

以上几步可以获取结果,当然可能对一些边缘数据有可能存在BUG,但这不影响主要原理的解释。边缘可以通过增加判断处理完成。

这里主要解释一下第三步骤的内容

1、首先里面一层SQL

SELECT t_TIME,t_ISOM,ROW_NUMBER() OVER(ORDER BY t_TIME)-ROW_NUMBER() OVER(PARTITION BY t_ISOM ORDER BY t_TIME) x
    ,Lead(t_TIME)  over(order by t_TIME) as dnext,lag(t_TIME)  over(order by t_TIME) as dpre
          FROM test_date

这里主要有ROW_NUMBER() OVER(ORDER BY t_TIME)和ROW_NUMBER() OVER(PARTITION BY t_ISOM ORDER BY t_TIME)这两个值的获取是处理连续性的关键

ROW_NUMBER() OVER(ORDER BY t_TIME):根据时间排序获取ROW_NUMBER(),保证所有记录有连续编号

ROW_NUMBER() OVER(PARTITION BY t_ISOM ORDER BY t_TIME):根据标记位分组,再对时间排序,保证分组内记录有连续编号。


因为两个都是连续的,所以相减,那么每个分组都会得到一个值(这里说的是每个分组,所以每个分组内的记录也是一样的值),暂定为X

Lead和lag是统计函数,获取下一行和前一行的记录,这没有难度。

2、根据第一层的结果,对结果加工,根据X值分组,获取每个分组的最大和最小日期。

3、剩下的就可以任意摆布了,所有的结果都已经在第二层中计算出来的,可以根据自己想要任意组合获取想要的结果。比如当前记录最近得标记位是1的记录等等。


    
 
 

您可能感兴趣的文章:

  • oracle删除文件后数据库启动不了的处理方法
  • Linux系统下导出ORACLE数据库出现Exporting questionable statistics.错误 处理
  • oracle 11g导出数据时报ORA 1455错误的处理方法
  • 处理Oracle数据库中杀不掉的锁
  • Oracle 管道 解决Exp/Imp大量数据处理问题
  • 高分求救:谁用过JSP处理ORACLE数据库中的LONG RAW类型字段
  • Oracle7.X 回滚表空间数据文件误删除处理方法
  • Oracle数据库系统紧急故障处理方法
  • Oracle数据库中的字符处理技巧总结
  • Oracle 数据库 临时数据的处理方法
  • Oracle数据库处理多媒体信息
  • oracle while的用法示例分享
  • Oracle 使用Java Source 简单示例
  • ORACLE 毫秒与日期的相互转换示例
  • java使用jdbc链接Oracle示例类分享
  • Oracle数据库安装配置示例
  • java操作oracle数据库示例
  • Oracle数据库安装配置流程示例详细解析
  • oracle表空间中空表统计方法示例介绍
  • oracle创建删除用户示例分享(oracle删除用户命令及授权)
  • 数据库查询排序使用随机排序结果示例(Oracle/MySQL/MS SQL Server)
  • Oracle层次查询和with函数的使用示例
  • php连接oracle数据库的示例代码
  • ORACLE实现字段自增示例说明
  • SqlServer实现类似Oracle的before触发器示例
  • oracle截取字符(substr)检索字符位置(instr)示例介绍
  • Oracle外键不加索引引起死锁示例
  • Oracle定义DES加密解密及MD5加密函数示例
  • Oracle数据库密码重置、导入导出库命令示例应用
  • 随机获取oracle数据库中的任意一行数据(rownum)示例介绍
  • oracle comment命令用法示例分享
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 在Redhat7.2+Oracle8i如果硬件配置中用P4处理器,对oracle的安装有没有影响(100分)
  • Oracle控制文件多元化处理
  • 关于ORACLE中执行批处理的问题
  • MS Server和Oracle中对NULL处理的一些细节差异
  • ORACLE DATAGUARD中手工处理日志v$archive_GAP的方法
  • Oracle 10g中用FIRALL处理非连续数组
  • 重新安装主机后ORACLE DB的处理
  • 轻轻松松学会在Oracle中实现时间相加处理
  • redhat 下 oracle proc 预处理总是留下 tpXXXXXX 的临时文件
  • Oracle时间精确到时、分、秒处理方案
  • 一次Oracle故障处理过程
  • Oracle 插入超4000字节的CLOB字段的处理方法
  • Oracle 10g中用FORALL处理非连续数组
  • Oracle对于死锁的处理方法
  • Oracle中关于处理小数点位数的几个函数
  • SQL Server和Oracle并行处理比较分析
  • Oracle中对超长内容的处理
  • 解析jdbc处理oracle的clob字段的详解
  • oracle报错(ORA-00600)问题处理
  • Oracle 存储过程总结 二、字符串处理相关函数
  • Oracle 12c发布简单介绍及官方下载地址
  • 在linux下安装oracle,如何设置让oracle自动启动!也就是让oracle那个服务自动启动,不是手动的
  • oracle 11g最新版官方下载地址
  • 请问su oracle 和su - oracle有什么不同?
  • Oracle 数据库(oracle Database)Select 多表关联查询方式
  • 虚拟机装Oracle R12与Oracle10g
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • Oracle 数据库开发工具 Oracle SQL Developer
  • 如何设置让Oracle SQL Developer显示的时间包含时分秒
  • Oracle EBS R12 支持 Oracle Database 11g
  • Oracle 10g和Oracle 11g网格技术介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,