oracle中如何求出最大连续登陆日期

大厂面试,或者做一些用户活跃数据的工作经常会和连续登录日期打交道。
今天来看看这种问题的解题思路。

1.用户当日登陆多次的情况下,首先需要根据用户登陆日期到yyyymmdd粒度进行去重。

得到如下模拟表样进行我们后面的解题:
这部分表格是我自己进行模拟的数据,不涉及他人隐私
2.去重之后,我们首先根据用户和日期进行开窗,得到一个按日期排名的顺序号:

select t.*, rank() over(partition by t.id order by t.login_date) rk
  from LOGIN_INF t

执行后结果如下:
这里的rank采用默认升序,升序降序后面的加减法将会不同

3.使用登陆日期减去我们rank的结果(降序则加)

得到一个日期标识:

select id, login_date, login_date - rk date_flag
  from (select t.*, rank() over(partition by t.id order by t.login_date) rk
          from LOGIN_INF t)

执行结果如下:
可以看到凡是连续登录的日期,减去rk后得到的日期标识都是同一天

4.根据用户和得到的日期标识进行聚合函数统计:

select id, date_flag, count(*) last_day
  from (select id, login_date, login_date - rk date_flag
          from (select t.*,
                       rank() over(partition by t.id order by t.login_date) rk
                  from LOGIN_INF t))
 group by id, date_flag

得到结果如下:
求得的last_day就是持续登陆天数
最后再嵌套一层max就能求出最大连续登陆天数了。
这种问题还有其他的解题思路,但目前我个人推荐这个嵌套的解决方案,其他方案比如拉链表之类的比较麻烦和耗性能,比较难想明白,如果有其他简单方案也欢迎评论区讨论。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值