08-JAN-15 耗时1天
其中SUSPEND和RESUME操作是一组操作,RESUME操作依赖于SUSPEND,这一点很容易理解,要解冻账号,首先账号得已经冻结。
所以对于上面的操作来说我们期望得到对于ACCOUNT_ID为1的账户来说,耗时8天。
如果单纯得到最大值减去最小值得到的时间差是不准确的,毕竟每组操作的时间是不连续的。
我使用了如下的语句进行了简单模拟。
首先创建表test
create table test(account_id number,activity_code varchar2(30),effective_date date);
插入一些数据,为了尽量使数据看起来不是很规整,把数据的插入顺序进行了微调。
insert into test values(1,‘SUSPEND‘,sysdate-12);
insert into test values(1,‘RESUME‘,sysdate-8);
insert into test values(1,‘SUSPEND‘,sysdate -6);
insert into test values(1,‘RESUME‘,sysdate-3);
insert into test values(2,‘SUSPEND‘,sysdate-10);
insert into test values(2,‘RESUME‘,sysdate-7);
insert into test values(2,‘SUSPEND‘,sysdate -5);
insert into test values(2,‘RESUME‘,sysdate-4);
insert into test values(2,‘SUSPEND‘,sysdate-2);
insert into test values(2,‘RESUME‘,sysdate-1);
insert into test values(1,‘SUSPEND‘,sysdate-2);
insert into test values(1,‘RESUME‘,sysdate-1);
这样我们得到了一个基本的列表。代表某个账户在某个时间段进行了某些操作。
ACCOUNT_ID ACTIVITY_CODE EFFECTIVE_DATE
---------- ------------------------------ ------------------
1 SUSPEND 28-DEC-14
1 RESUME 01-JAN-15
1 SUSPEND 03-JAN-15
1 RESUME 06-JAN-15
2 SUSPEND 30-DEC-14
2 RESUME 02-JAN-15
2 SUSPEND 04-JAN-15
2 RESUME 05-JAN-15
2 SUSPEND 07-JAN-15
2 RESUME 08-JAN-15
1 SUSPEND 07-JAN-15
1 RESUME 08-JAN-15
这个时候我们对数据进行基本的排序,就能够清晰的看到这些操作的时间。
我们进行重要的一步操作,把操作进行分组,即SUSPEND-RESUME的操作合成一些,可以使用分析函数lead来完成。
比如对于
select t.account_id,effective_date,lead(effective_date,1,effective_date) over(partition by account_id order by account_id,effective_date) next_date from test t
2 /
ACCOUNT_ID EFFECTIVE_DATE NEXT_DATE
---------- ------------------ ------------------
1 28-DEC-14 01-JAN-15
1 01-JAN-15 03-JAN-15
1 03-JAN-15 06-JAN-15
1 06-JAN-15 07-JAN-15
1 07-JAN-15 08-JAN-15
1 08-JAN-15 08-JAN-15
2 30-DEC-14 02-JAN-15
2 02-JAN-15 04-JAN-15
2 04-JAN-15 05-JAN-15
2 05-JAN-15 07-JAN-15
2 07-JAN-15 08-JAN-15
2 08-JAN-15 08-JAN-15
这样就把操作进行了一个初步的分组,但是标黄列的数据是错误的,它统计的是RESUME-SUSPEND的时间差,这个和逻辑不符,我们需要得到的是SUSPEND-RESUME的时间差。我们可以进行简单过滤。
SQL> select rownum,mod(rownum,2)chk_num,t.account_id,next_date-effective_date duration from