oracle连续天数的计算

注:技术交流可以加我VX:k-loop,昵称:默读者。

--1,创建一个用户登录表
 

create table tmp_ma(
u_id   varchar2(20) ,
login_day date
);
comment on table tmp_ma is '用户登录表';
comment on column tmp_ma.u_id is '用户id';
comment on column tmp_ma.login_day is '登录日期';


--2,插入测试数据,用户A在20190601-201906-04,连续登陆4天,用户A在20190606-201906-07,连续登陆2天。


 

insert into tmp_ma(u_id,login_day) values('A',date'2019-06-01');
insert into tmp_ma(u_id,login_day) values('A',date'2019-06-02');
insert into tmp_ma(u_id,login_day) values('A',date'2019-06-03');
insert into tmp_ma(u_id,login_day) values('A',date'2019-06-04');
insert into tmp_ma(u_id,login_day) values('A',date'2019-06-06');
insert into tmp_ma(u_id,login_day) values('A',date'2019-06-07');


--3,根据用户id分组且以登陆日期升序排序,插入临时表中

create table o_tmp_ma_01
as
select 
m.u_id --用户id
,m.login_day --登录日期
,row_number()over(partition by m.u_id order by m.login_day asc) rn --排序
from tmp_ma m  
;
select 
u_id --用户id
,login_day --登录日期
,rn --排序
from o_tmp_ma_01 
;

 

查询结果如下:

U_IDLOGIN_DAYRN
A2019/6/11
A2019/6/22
A2019/6/33
A2019/6/44
A2019/6/65
A2019/6/76

--4,以用户id,登录日期-排序分组,计算连续登陆天数,插入临时表

--分析:如果登陆日期连续,那么登录日期-排序是相同的,所以要以这个差分组。

create table o_tmp_ma_02
as
select 
u_id --用户id
,login_day-rn compare_day --比较日期
,count(*) continuity_days --连续登陆天数
from o_tmp_ma_01 
group by u_id,login_day-rn
;
select
u_id --用户id
,compare_day --比较日期
,continuity_days --连续登陆天数
from o_tmp_ma_02
;

查询结果如下:

U_IDCOMPARE_DAYCONTINUITY_DAYS
A2019/6/12
A2019/5/314

 

--5,以用户id分组,比较日期升序排序,计算每个比较日期的连续登陆天数,以及累计登陆天数,插入临时表

create table o_tmp_ma_03
as
select 
u_id --用户id
,compare_day --比较日期
,continuity_days --连续登陆天数
,sum(continuity_days) over(partition by u_id order by compare_day asc ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) cumulative_continuity_days --累计的登陆天数
,row_number()over(partition by u_id order by compare_day asc) rn --排序
from o_tmp_ma_02
;
select
u_id --用户id
,compare_day --比较日期
,continuity_days --连续登陆天数
,cumulative_continuity_days --累计的登陆天数
,rn --排序
from o_tmp_ma_03
;

查询结果如下:

U_IDCOMPARE_DAYCONTINUITY_DAYSCUMULATIVE_CONTINUITY_DAYSRN
A2019/5/31441
A2019/6/1262

 

--6,计算出用户的两个连续登陆区间内的连续登陆天数,累计登陆天数,连续登陆的开始时间,以及连续登陆的结束时间,插入临时表

create table o_tmp_ma_04
as
select
u_id  --用户id
,compare_day  --比较日期
,continuity_days    --连续登陆天数
,cumulative_continuity_days --累计的登陆天数
,compare_day+cumulative_continuity_days-continuity_days+1 continuity_frist_day --连续登陆的第一天
,compare_day+cumulative_continuity_days continuity_last_day --连续登陆的最后一天
,rn
from o_tmp_ma_03
;

 

select 
u_id  --用户id
,compare_day  --比较日期
,continuity_days    --连续登陆天数
,cumulative_continuity_days --累计的登陆天数
,continuity_frist_day --连续登陆的第一天
,continuity_last_day --连续登陆的最后一天
,rn
from o_tmp_ma_04
;

查询结果如下:

U_IDCOMPARE_DAYCONTINUITY_DAYSCUMULATIVE_CONTINUITY_DAYSCONTINUITY_FRIST_DAYCONTINUITY_LAST_DAYRN
A2019/5/31442019/6/12019/6/41
A2019/6/1262019/6/62019/6/72

--查询最早的一段连续登陆的情况

select 
u_id  --用户id
,compare_day  --比较日期
,continuity_days    --连续登陆天数
,cumulative_continuity_days --累计的登陆天数
,continuity_frist_day --连续登陆的第一天
,continuity_last_day --连续登陆的最后一天
,rn
from o_tmp_ma_04
where rn=1
;

查询结果如下:

U_IDCOMPARE_DAYCONTINUITY_DAYSCUMULATIVE_CONTINUITY_DAYSCONTINUITY_FRIST_DAYCONTINUITY_LAST_DAYRN
A2019/5/31442019/6/12019/6/41

分析:用户A最早一段连续登陆情况是,20190601第1天登陆,连续登陆了4天,最后一次连续登陆的时间是20190604,这段连续时间内,累计登陆了4天。

--查询最近的一段连续登陆的情况
--将第5步里面的,row_number()over(partition by u_id order by compare_day asc) rn 改成
--row_number()over(partition by u_id order by compare_day desc) rn  即可。

select 
u_id  --用户id
,compare_day  --比较日期
,continuity_days    --连续登陆天数
,cumulative_continuity_days --累计的登陆天数
,continuity_frist_day --连续登陆的第一天
,continuity_last_day --连续登陆的最后一天
,rn
from o_tmp_ma_04
where rn=1
;

查询结果如下:

U_IDCOMPARE_DAYCONTINUITY_DAYSCUMULATIVE_CONTINUITY_DAYSCONTINUITY_FRIST_DAYCONTINUITY_LAST_DAYRN
A2019/6/1262019/6/62019/6/71

分析:用户A最近一段连续登陆情况是,20190601到20190607日之间,这7天内,离现在最近的一段连续登陆情况是,20190606登陆,,到20190607日,连续登陆2天。这7天累计有6天登陆。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值