排序解决连续签到问题

需求描述

有一张用户签到的明细表,需要找出连续签到3天及以上的用户
1:查看表信息
select * from tmp.log_test;
user_id        login_time
A                 2019-11-30 19:26:55 490
A                 2019-11-30 20:26:55 494
A                 2019-12-01 20:26:55 495
A                 2019-12-02 10:26:55 595
B                 2019-12-01 20:26:55 495
B                 2019-12-02 10:26:55 595
C                 2019-11-30 19:26:55 490
C                 2019-11-30 20:26:55 494
C                 2019-12-02 10:26:55 595
2:去重排序
select
user_id,
to_date(login_time) as login_date,
rank()over(partition by user_id order by to_date(login_time)) as rk
from tmp.log_test
group by user_id,to_date(login_time)
order by user_id,login_date

得出结果
在这里插入图片描述

3:签到日期-序列号得到开始签到时间
select
user_id,
login_date,
rk,
date_sub(login_date,rk) as netdate
from(
select
user_id,
to_date(login_time) as login_date,
rank()over(partition by user_id order by to_date(login_time)) as rk
from tmp.log_test
group by user_id,to_date(login_time)
order by user_id,login_date)a

得到结果
在这里插入图片描述

3:根据开始签到时间count,即可知道每次连续签到时间
select
user_id,
netdate,
count(1) as count
from 
(
select
user_id,
login_date,
rk,
date_sub(login_date,rk) as netdate
from(
select
user_id,
to_date(login_time) as login_date,
rank()over(partition by user_id order by to_date(login_time)) as rk
from tmp.log_test
group by user_id,to_date(login_time)
order by user_id,login_date)a
)a
group by user_id,
netdate
having count(1)>=3

得到结果
在这里插入图片描述

ps:上面的sql有点冗长,可以自己优化一下,或者搞个临时表啥的

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值