SQL查询语句求出用户的连续登陆天数
作者:Heng_bigdate_yan 发布时间:2024-01-17 22:00:40
标签:SQL,查询语句
一、题目描述
求解用户登陆信息表中,每个用户连续登陆平台的天数,连续登陆基础为汇总日期必须登陆,表中每天只有一条用户登陆数据(计算中不涉及天内去重)。
表描述:user_id:用户的id;
sigin_date:用户的登陆日期。
二、解法分析
注:求解过程有多种方式,下述求解解法为笔者思路,其他解法可在评论区交流。
思路:
该问题的突破的在于登陆时间,计算得到连续登陆标识,以标识分组为过滤条件,得到连续登陆的天数,最后以user_id分组,以count()函数求和得到每个用户的连续登陆天数。
连续登陆标识 =(当日登陆日期 - 用户的登陆日期)- 开窗排序的顺序号(倒序)
三、求解过程及结果展示
1.数据准备
-- 1.建表语句
drop table if exists test_sigindate_cnt;
create table test_sigindate_cnt(
user_id string
,sigin_date string
)
;
-- 2.测试数据插入语句
insert overwrite table test_sigindate_cnt
select 'uid_1' as user_id,'2021-08-03' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-04' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-01' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-02' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-05' as sigin_date
union all
select 'uid_1' as user_id,'2021-08-06' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-01' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-05' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-02' as sigin_date
union all
select 'uid_2' as user_id,'2021-08-06' as sigin_date
union all
select 'uid_3' as user_id,'2021-08-04' as sigin_date
union all
select 'uid_3' as user_id,'2021-08-06' as sigin_date
union all
select 'uid_4' as user_id,'2021-08-03' as sigin_date
union all
select 'uid_4' as user_id,'2021-08-02' as sigin_date
;
2.计算过程
select user_id
,count(1) as sigin_cnt
from (
select
user_id
,datediff('2021-08-06',sigin_date) as data_diff
,row_number() over (partition by user_id order by sigin_date desc) as row_num
from test_sigindate_cnt
) t
where data_diff - row_num = -1
group by
user_id
;
3.计算结果及预期结果对比
3.1 预期结果
汇总日期 | 用户id | 登陆天数 |
2021-08-06 | uid_1 | 6 |
2021-08-06 | uid_2 | 2 |
2021-08-06 | uid_3 | 1 |
3.2 计算结果
来源:https://blog.csdn.net/Heng_bigdate_yan/article/details/120643783


猜你喜欢
- 目标是想把在服务器上用pytorch训练好的模型转换为可以在移动端运行的tflite模型。最直接的思路是想把pytorch模型转换为tens
- 一、python这么多版本如何选择?作为初学者,只需知道 Python 分 Python 2.x 和 Python 3.x 两大版本就可以了
- Python 在命令行解析方面给出了类似的几个选择:自己解析, 自给自足(batteries-included)的方式,以及大量的
- 在实际的工作中,尤其是在生产环境里边,SQL语句的优化问题十分的重要,它对数据库的性能的提升也起着显著的作用.我们总是在抱怨机器的性能问题,
- 本文我们来看一下如何使用 Python 将 QQ 好友头像拼成“五一快乐”四个字。我们可以将整个实现过程分为两步:爬取 QQ 好友头像、利用
- 正则表达式是一种进行模式匹配和文本操纵的功能强大的工具。正则表达式灵活、易用,按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出
- 本文实例讲述了Python求解平方根的方法。分享给大家供大家参考。具体如下:主要通过SICP的内容改写而来。基于newton method求
- 本文实例讲述了python threading和multiprocessing模块基本用法。分享给大家供大家参考,具体如下:前言这两天为了做
- MySQL中的锁锁是为了解决并发环境下资源竞争的手段,其中乐观并发控制,悲观并发控制和多版本并发控制是数据库并发控制主要采用的技术手段(具体
- 通过创建变量var a = 'something' + '  
- 实际上关键词叫 微信pushState只能分享落地页 更贴切一点应用场景:vue + vue-routervue-router使用hash模
- Sjoerd Visscher 发现了一个简洁的 方法 让样式在 IE 中作用到未知的元素上——仅需 JS 创建此未知元素即可:docume
- 假设我们有以下虚拟函数:import sysdef writeline(text, stream=sys.stdout): stream.w
- 图片的自动编码很容易就想到用卷积神经网络做为编码-解码器。在实际的操作中,也经常使用卷积自动编码器去解决图像编码问题,而且非常有效。下面通过
- 先介绍一下SQLSERVER中的存储类对象,哈哈,先介绍一下概念嘛,让新手老手都有一个认知SQLSERVER Management Stud
- 1. logging日志的介绍在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记
- 优点:·减少使用空间·使后面的背景层模糊或者渐隐出现让用户的焦点集中在当前层。什么时候使用(对话框等)模式窗口?·图片/视频灯箱效果·联系表
- 本文实例讲述了python实现的简单窗口倒计时界面。分享给大家供大家参考。具体分析如下:下面的代码通过Tkinter制作windows窗口界
- python3 最常用的三种装饰器语法总结1.简述语法装饰器也叫函数装饰器,主要作用是在不修改原来函数的代码情况下(函数本身不会被修改,执行
- 当我们使用访问一个没有声明的变量时,JS会报错;而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量。