oracle 组内连续有数据处理,Oracle连续数据处理示例

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

本文永久更新链接地址: 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:php中文网

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值