SQL连续登录判断算法二

#原创文章,转载请注明出处

 1.创建表,要关注的字段是用户id和登录时间.创建试验数据:

--Oracle
CREATE TABLE "TIM"."LOGIN_INFO" 
   (	"USERID" VARCHAR2(5), 
	"LOGIN_DATE" DATE
   )
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('01-03-2024 07:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('01-03-2024 15:41:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('03-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('05-03-2024 12:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('06-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('07-03-2024 09:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('09-03-2024 10:30:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('11-03-2024 09:53:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('12-03-2024 11:45:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('13-03-2024 15:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('14-03-2024 14:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('15-03-2024 16:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('16-03-2024 09:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('17-03-2024 10:08:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('19-03-2024 19:05:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('21-03-2024 06:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('22-03-2024 21:47:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('25-03-2024 08:40:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('25-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('26-03-2024 10:00:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('27-03-2024 12:30:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('28-03-2024 08:20:00', 'dd-mm-yyyy hh24:mi:ss'));
insert into LOGIN_INFO (userid, login_date)
values ('00001', to_date('29-03-2024 09:00:00', 'dd-mm-yyyy hh24:mi:ss'));
commit;

2.分组去重并排序

select distinct USERID,trunc(LOGIN_DATE) td from login_info  order by userid,trunc(LOGIN_DATE)

3.连续登录7天,去重的数据里:从开始的一天往后数7天总共有7条数据.这里用子查询实现

with t as(select distinct USERID,trunc(LOGIN_DATE) td from login_info order by userid,trunc(LOGIN_DATE)) --去重的表取别名 t
select * from t t1 where exists(select 1 from t t2 where t1.userid=t2.userid and t2.td<t1.td+7 and t1.td<=t2.td having count(*)=7 )  --往后数7天,有7条数据

--7日连续登录起始日期

with t as(select distinct USERID,trunc(LOGIN_DATE) td from login_info order by userid,trunc(LOGIN_DATE)) --去重的表取别名 t
select * from t t1 where exists(select 1 from t t2 where t1.userid=t2.userid and t2.td+7>t1.td and t1.td>=t2.td having count(*)=7) --往前数7天,有7条数据

--7日连续登录终止日期

有数据则说明有连续登录7天

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值