用户连续登陆

  • 一、规定时间内用户最大连续登陆天数
  • 二、user_login表字段(所有用户登陆信息)
  • 三、分解步骤
    • 1.where初步筛选
    • 2.窗口函数分组排序
    • 4.计算获得连续的字段
    • 5.分组计算连续天数
    • 6.求得结果
    • 7.连续SQL
    • 8.使用函数总结
      • (1)timestampdiff(unit, start, end)
      • (2)窗口函数排序
      • (3)date_sub()

一、规定时间内用户最大连续登陆天数

为了看有哪些忠实用户,积极使用产品,需要计算用户的连续登陆天数。

二、user_login表字段(所有用户登陆信息)

user_id login_time
valk ‘2021-08-08 18:30:20’
zaa ‘2021-08-07 18:30:20’
zb ‘2019-09-07 18:30:20’

三、分解步骤

1.where初步筛选

首先使用timestampdiff(unit, begin, end) <= 30进行where的条件筛选,得到新表t_1

-- t_1表
select user_id, log_time
from user_login
where timestampdiff(day, login_time, now()) <= 30;

这样符合条件数据就出来了

user_id login_time
valk ‘2021-08-08 18:30:20’
zaa ‘2021-08-07 18:30:20’

2.窗口函数分组排序

使用row_number() over(partition by order by )进行排序。

得到一个按user_id分组并有排序编号的新表t_2

-- t_2表
select user_id, date(login_time) as login_daterow_number() over(partition by user_id, order by login_time ascending) as rank
from t_1

t_2表

user_id login_date rank
valk 2021-08-08 1
valk 2021-08-09 2
valk 2021-08-10 3
valk 2021-08-11 4
zaa 2021-08-07 1
zaa 2021-08-20 2
zaa 2021-08-22 3

4.计算获得连续的字段

通过观察可以发现,若同组用户login_date是连续的,分别减去rank后所得到的结果是一样的,2021-08-08 - 1 = 2021-08-07,2021-08-09 - 2 = 2021-08-07等等。使用date_sub函数获得新的列gap和新表t_3

-- t_3
select user_id, login_date,date_sub(login_date, interval rank day) as gap
from t_2

t_3表

user_id login_date gap
valk 2021-08-08 2021-08-07
valk 2021-08-09 2021-08-07
valk 2021-08-10 2021-08-07
valk 2021-08-11 2021-08-07
zaa 2021-08-07 2021-08-06
zaa 2021-08-20 2021-08-18
zaa 2021-08-22 2021-08-19

5.分组计算连续天数

此时对t_3表按user_id、gap进行分组,并对组内的login_date进行count计数,得到表t_4

-- t_4
select user_id, gap, count(login_date) as num
from t_3
group by user_id, gap

t_4表

user_id gap num
valk 2021-08-07 4
zaa 2021-08-06 1
zaa 2021-08-18 1
zaa 2021-08-19 1

6.求得结果

最后按照user_id进行分组,使用max取出最大的num

select user_id, max(num) as series_login -- 按user_id分组,求最大连续登陆天数
from t_4
group by user_id
user_id series_login
valk 4
zaa 1

终于我们求出了,近30天内,valk用户最大连续登陆4天,zaa最大连续登陆1天。

7.连续SQL

-- sql_4_start
select user_id, max(num) as series_login
from
(-- sql_3_start:按user_id, date_sub结果分组,计数求得连续登陆天数 num
select user_id, gap, count(login_time) as num
from
(-- sql_2_start:主要求出data_sub的结果,结果相同则代表连续登陆
select user_id, login_time,date_sub(login_time, interval rank day) as gap
from
(-- sql_1_start:where 筛选出30天内的数据, row_number 进行分组排序,得出t_1表
select user_id,login_time,row_number() over(partition by user_id, order by login_time ascending) as rank
from user_login
where timestampdiff(day, login_time, now()) <= 30 -- sql_1_end
) as t_1 -- sql_2_end) as t_2 group by user_id, gap -- sql_3_end) as t_3 group by user_id --sql_4_end

8.使用函数总结

(1)timestampdiff(unit, start, end)

where timestampdiff(unit, datetime_start, datetime_end) <= 30;
-- unit 包含datetime_end 减 datetiem_start 的结果的单位,有大小正负区别
-- unit主要包括 year, month, week, day, hour, minute, second


(2)窗口函数排序

例如对10,20,30,30,50 五个数字升序排序
row_number() over(partition by column, order by column ascending/descending)
partition by 指按何列进行分组,order by 指按何列进行升序/降序排序

函数名 属性 排序数字 排序结果
row_number() 连续,不重复 10,20,30,30,50 1,2,3,4,5
rank() 重复,不连续 10,20,30,30,50 1,2,3,3,5
dense_rank() 连续且重复 10,20,30,30,50 1,2,3,3,4

(3)date_sub()

date_sub(date, interval expr type),指从相应日期date 减去 expr 的时间数量
type 可以是year, month, week, day, hour, minute, second 等

求用户最大连续登陆天数mysql实现相关推荐

  1. SQL计算QQ连续登陆天数

    最近遇到一个SQL查询需求:计算QQ连续登陆天数? 连续登陆天数不间断,如果有一天没登陆就重新计算. 数据准备 mysql> create table user_login(user_id in ...

  2. SQL求用户的最大连续登陆天数

    建表插入数据 create table tmp_continous (id STRING ,time DATETIME );INSERT OVERWRITE TABLE tmp_continous S ...

  3. mysql 连续签到天数_获取连续登陆天数,连续签到天数 ,方法优化

    获取连续登陆天数,连续签到天数,类似这样的需求应该是一个常见的需求,那么我们有没有一套成熟的解决方案呢 ?下面我来跟大家分享一下我的故事. 在猴年马月的一天,有个用户反馈个人中心打开缓慢,需要7.8秒 ...

  4. HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数

    HIVE面试题原理详解 统计用户连续交易的总额.连续登陆天数.连续登陆开始和结束时间.间隔天数 友情提示 创建数据表 添加数据 流程图 第一步分析(子表a) 第二步分析(子表b) 第三步分析(子表c) ...

  5. SQL查询用户的最长连续登陆天数

    题目重点:连续 设表名字:user_login 第一步:使用ROW_NUMBER() 窗口函数 按UID分组,按date1升序排 -- 第一段首先根据用户分组,登陆时间排序,结果按照登陆时间升序排列 ...

  6. SQL计算连续登陆天数大于等于3天的用户

    其中给出了用户(id)和用户登陆时间(dt)两列 其中要处理把登陆时间截取到日,然后根据id和登陆时间dt进行去重,然后得到如下的数据集 再进行下面的代码 select id, sdate, edat ...

  7. 如何统计连续(连续登陆天数,连续学习天数,连续购买天数)

    直接来看实战,现在有一张表t,这张表存储了每个员工每天的打卡情况,现在需要统计截止目前每个员工的连续打卡天数,表t如下表所示: uid    tdate    is_flag 1    2020/2/ ...

  8. 超详细解析:用sql查找连续登陆7天或者登陆天数最多的用户id

    # 方法一:查询连续登陆7天的用户id和登陆天数 -- 第一步:用户登录日期去重 select distinct date(date) as 日期,id from tb_user; -- 第二步:用r ...

  9. TSQL--查找连续登陆用户

    --========================================== 需求:有一个用户登陆日志表,记录用户每次登陆时间,然后想查找用户按天连续登陆的情况,找出每次连续登陆的最早时间 ...

最新文章

  1. 从0梳理1场CV缺陷检测赛事!
  2. FPGA 时序约束系列之周期约束
  3. 关于网页显示乱码问题的一些个人见解(PHP、JSP...)
  4. 本机的计算机管理员,c# 获得本机计算机名字,获得本机当前系统登陆用户和管理员权限,Environment...
  5. .NET生态现状:超一半 .NET开发者使用C# 8、.NET Framework使用量减少
  6. gitee 从 拉取新分支到本地_Hexo博客详细教程(一)| 建立本地站点
  7. python链表实现栈_使用python实现数组、链表、队列、栈
  8. 全局变量,extern和static以及命名空间的区别
  9. python-虚拟环境的作用
  10. Python 3 Basics
  11. 企业级MySQL数据库备份方案:增量备份、全量备份、逻辑备份
  12. SQL ltrim() 和 rtrim() 函数
  13. 红帽子 linux 声卡驱动,RedHat Linux系统下安装ALSA驱动的方法
  14. [含论文+任务书+中期检查表+答辩PPT+源码等]基于javaweb的政府机关公文收发系统
  15. 872. 叶子相似的树 / 剑指 Offer 33. 二叉搜索树的后序遍历序列 / 剑指 Offer 34. 二叉树中和为某一值的路径 / 剑指 Offer 35. 复杂链表的复制
  16. excel表格如何转换成word表格_告诉你如何将excel表格转换成word文档
  17. ORACLE等待事件相关
  18. 华东师大在职计算机分数线,报考华东师范大学在职研究生分数线是多少呢?
  19. 18天精读掌握《费曼物理学讲义卷一》 第14天 2019/6/30
  20. 618 线上摆摊 | 看直播 领京豆

热门文章

  1. SwiftUI小技巧之如何获取全球语言编码
  2. MSRA被曝停招国防七子及北邮学生!
  3. NYOJ 675 Sinking Ship
  4. 从新手到老鸟的脱变过程之《如何做手游项目》
  5. Skype for Business Server 2015系列(一)概述和准备工作
  6. 同济七版高等数学 上册 复习指导、公式推理简易过程、常用结论归纳
  7. IEEE RAL投初稿
  8. php调用python pkl_Python中的Pickle操作(pkl文件解释)
  9. PMP自学不报班5A通过经验总结(附PMBOK高清电子书完整书签)
  10. 河南出版团体召开宣扬工作会议