Oracle连续数据处理示例

下面这段内容讲解的功能是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的记录等等。

时间: 2024-12-15 11:00:21

Oracle连续数据处理示例的相关文章

一个非常标准的Java连接Oracle数据库的示例代码

最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径->配置构建路径,选择第三项"库",然后点击"添加外部Jar",选择"D:\Oracle\app\oracle\product\11.2.0\server \jdbc\lib\ojdbc6_g.jar"(注:D:\Oracle为数据库的安装路径). 2.以下代码为非常标准的Oracle数据库连接代码示例: /** * 一个非常标准的连接Oracl

Java连接Oracle数据库的示例代码

最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径 ->配置构建路径,选择第三项“库”,然后点击“添加外部Jar”,选择 “D:\Oracle\app\oracle\product\11.2.0\server \jdbc\lib\ojdbc6_g.jar”(注:D:\Oracle为数据库的安装路径). 2.以下代码为非常标准的Oracle数据库连接代码示例: /** * 一个非常标准的连接Oracle数据库的示例代码 */public void test

Oracle sqlldr使用示例

SQLLDR用于快速的批量导入数据, 示例步骤如下: 1.确定Oracle的连接示例 username/[email protected] 我使用的是:system/world @ localorcl sid是连接的示例,也就是net manager中的服务命名,示意图如下: 2.创建表,语句如下: CREATE TABLE TT ( ID INTEGER, NAME VARCHAR2(20 BYTE), CON VARCHAR2(20 BYTE), DT DATE ) 3.在D盘下创建数据文件

【转】一个非常标准的Java连接Oracle数据库的示例代码

原文地址: http://www.cnblogs.com/liuxianan/archive/2012/08/05/2624300.html 最基本的Oracle数据库连接代码(只针对Oracle11g): 1.右键项目->构建路径->配置构建路径,选择第三项“库”,然后点击“添加外部Jar”,选择“D:\Oracle\app\oracle\product\11.2.0\server \jdbc\lib\ojdbc6_g.jar”(注:D:\Oracle为数据库的安装路径). 2.以下代码为非

oracle exp/imp示例及使用问题整理

oracle常用的迁移工具有exp,imp,expdp,impdp,dblink等方式,实际过程中可以根据工具特点,数据库的具体环境情况,灵活采用.   exp/imp工具应方便简单使用,在数据量不大的情况下使用很频繁, 这个简要记录下使用中遇到的问题. 一.exp/imp版本不能往上兼容问题, 数据库的版本问题一定要搞清楚. 1. 低版本的exp/imp可以连接高版本的数据库, 高版本exp/imp不能连接低版本的数据库.   2. 高版本exp导出的dmp文件, 低版本imp命令无法导入.

Oracle 添加 scott 示例用户

学习SQL有一段时间了,但是也忘记的差不多了,今天有赶紧复习复习,然后发现一个问题,为啥之前看的视频教程,马士兵用的Oracle有scott用户和那些表格,而我的没有?难道是Oracle取消了?然后百度了才知道,最新的Oracle需要自己添加这些表格. 获取soctt.sql文件 百度的结果呢,有2个: 人家共享出来的soctt.sql文件,很多的博客上面都有 自己Oracle下寻找 我在我的Oracle下搜索了一下,找到了, 运行脚本文件,添加数据进数据库 用之前的SQL Developer在

Oracle bbed 实用示例-----修改Data内容、恢复delete的rows

bbed 可以在db open 状态来进行修改,但是建议在做任何修改操作之前先shutdown db. 这样避免checkpoint 进程重写bbed 对block 的修改. 也避免oracle 在bbed 修改完成之前读block 或者申明block 为corrupt. 一. 示例: 修改Data内容 1.1连接bbed [[email protected] ~]$ bbed parfile=/u01/app/oracle/bbed/bbed.par Password: BBED: Relea

oracle 游标简单示例

1.游标的概念以及作用 游标(Cursor)可以使用户想操作数组一样对查询出来的结果集进行操作,可以形象的看做一个变动的光标,其实际行是一个指针,它在一段Oracle存放数据查询结果集或数据 操作集的内存中,这个指针可以指向结果集的任何位置. 分类: 分为静态游标和ref游标(暂不做介绍).静态游标 又分为 显示游标和隐式游标 ,隐式游标它是被oracle自动管理的 ,不需要详细的去了解只需要 知道怎么用就可以了. 显示游标:就是我们普遍使用的.就是在使用之前有着明确的定义,一般都会关联数据查询

SQL SERVER 2008向ORACLE 11G迁移示例

来源于:http://www.cnblogs.com/hiizsk/ 由SQL SERVER 2008向ORACLE 11G迁移过程记录之一-表 使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(一) 使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(二) 使用Oracle Sql Developer将SQL SERVER 2008数据库移植到Oracle 11g(三) 使用O