超详细解析:使用SQL语句查询连续登陆7天的用户信息
假设有如下表tb_user,现输出连续登陆7天的用户id
方法一思路:
1、因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重。
2、再用row_number() over(partition by _ order by _)函数将用户id分组,按照登陆时间进行排序。
3、计算登录日期减去第二步骤得到的结果值,用户连续登陆情况下,每次相减的结果都相同。
4、按照id和日期分组并求和,筛选大于等于7的即为连续7天登陆的用户。
-- 方法一
-- 第一步:用户登录日期去重
select distinct date(date) as 日期,id from tb_user;
-- 第二步:用row_number()计数
select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from tb_user)a;
-- 第三步:日期减去计数值得到结果
select *,date(日期)-cum as 结果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from tb_user)a)b;
-- 第四步:根据id和结果分组并计算总和,大于等于7的即为连续登录7天的用户
select id,count(*) from (select *,date(日期)-cum as 结果 from (select *,row_number() over(PARTITION by id order by 日期) as cum from (select DISTINCT date(date) as 日期,id from tb_user)a)b)c GROUP BY id,结果 having count(*)>=7;
select * from tb_user;-- 方法二
select id,count(date2) as 连续天数
from (select *,date_sub(date1,interval r day) date2from(select distinct id,date(date) date1,dense_rank()over(partition by id ORDER BY date(date)) as rfrom tb_user) v ) w
group by id,date2
having count(date2) >= 7;-- 方法三
select id,max(h) '登录天数'from(
select id ,count(e) h from (
select *,a-b as e from (
select *,row_number() over(order by id) b from(
select *,date_format(date,'%Y%m%d') a from (
select distinct id,date(date) date from tb_user order by id,date(date)) as c)as d) as f)as g
group by e,id)as i group by id having max(h) >= 7;-- 方法五
select id,max(sort1) as 最多登录天数
from(
select *,
dense_rank()over(partition by id,datesub order by id,date) as sort1
from
(select *,
date_sub(date,interval sort day) as datesub
from
(select id,date(date) date,
dense_rank()over(partition by id order by id,date(date)) as sort
from tb_user) a # 按id,date 不跳越排序
) b #计算 date - sort 日期差
) c group by id having max(sort1) >= 7; #再次排序 按id和 日期差-- 方法六
SELECT id,count(date-t2) `连续登录天数`
from(SELECT DISTINCT date(date) date,id,row_number()over(PARTITION by id)t2 from tb_user GROUP BY id,date(date)) a
group by id,date-t2 having count(date-t2) >= 7;-- 方法七
-- 排序+去重
select distinct id,date(date) date from tb_user order by id,date(date);
-- 给上表中添加row_number num 和 日期-num n
select id,date,row_number()over(partition by id) num,day(date) - row_number()over(partition by id) n from (select distinct id,date(date) date from tb_user order by id,date(date)) a;
-- 相同id且相同n的记录数超过7即可
select id,count(n) from (select id,date,row_number()over(partition by id) num,day(date)-row_number()over(partition by id) n from (select distinct id,date(date) date from tb_user order by id,date(date)) a) a group by id,n having count(n) >= 7;-- 方法八
select distinct a.id
from (select distinct id,day(date) day1,dense_rank()over(partition by id order by day(date)) dayno from tb_user) a
join (select distinct id,day(date) day1,dense_rank()over(partition by id order by day(date)) dayno from tb_user) b
on a.id = b.id
where a.day1 + 6 = b.day1 and a.dayno + 6 = b.dayno
group by a.id,a.day1;
超详细解析:使用SQL语句查询连续登陆7天的用户信息相关推荐
- 超详细解析:用sql查找连续登陆7天或者登陆天数最多的用户id
# 方法一:查询连续登陆7天的用户id和登陆天数 -- 第一步:用户登录日期去重 select distinct date(date) as 日期,id from tb_user; -- 第二步:用r ...
- mysql 连续七天不登录_【SQL】查询连续登陆7天以上的用户
查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助. 具体思路: 1.因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重. 2.再用row ...
- mysql连续登录5天以上用户,【SQL】查询连续登陆7天以上的用户
查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助. 具体思路: 1.因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重. 2.再用row ...
- 查询连续登陆7天以上的用户 Mysql
查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助. 具体思路: 1.因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重. 2.再用row ...
- 用sql语句查询出每门课都大于80 分的学生姓名案例解析
用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name course grade 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 10 ...
- 关于主从复制的超详细解析(全)
目录 前言 1. 主从复制 1.1 方式 2. Mysql的主从复制 2.1 一主一从 2.1.1 window和linux通讯 2.1.2 linux和linux的通讯 2.2 双主双从 3. Re ...
- HIVE:窗口函数,用sql语句查询MySQL安装路径和版本
数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...
- sql语句查询过慢的原因分析
有时候你在使用sql语句查询数据库,sql语句写得好正确,但则发现执行查询的时候很慢呢?数据量也不是太大,你知道其中的原因吗?本文给大家讲解一下sql查询过慢的48种原因分析,请阅读. 1.没有索引或 ...
- thinkphp5基本的一些操作/API友好/获取请求信息(Request)/判断请求类型(GET...)/验证参数数据(Validate)/连接数据库/原生sql语句查询
文章目录 一.API友好 1.举两个thinkphp5关于API友好的例子 (1)数据输出 (2)错误调试Trace 二.获取请求信息(Request) 1.获取URL信息 2.获取 模块/控制器/操 ...
最新文章
- plsql连接oracle报错12514,plsql 登录 oracle11 12514 错误的处理方法
- 自由自在休闲食品实现奶茶妹的创业梦
- python中thread的setDaemon、join的用法
- 晚上不睡觉,搞的一个例子《JS实现动画》
- 电视剧潜伏的真正结局
- input中autocomplete属性
- jQuery学习(十二)—jQuery中对象的查找方法总结
- MongoDB数据库(二):增删查改
- 【HDOJ4699】Editor(对顶栈,模拟)
- Spring 框架蕴含的设计思想
- 谷歌浏览器无法登陆问题
- 逆向序列号生成算法(三)
- 数字基础设施可视化管理,任重而道远
- Nacos 中配置 Map 类型,不香
- 15 | 网络优化(上):移动开发工程师必备的网络优化知识
- 栈帧ebp,esp详解
- 从excel中读取信号,首先计算信号的vmd分解,得到imf分量
- Git提交指定的文件
- python扫雷 高级算法_利用Python实现自动扫雷
- 2022年黄石助理工程师职称申报材料需要准备哪些?
热门文章
- 顺丰慢吗,了解这些问题你就能得到答案
- 2020 java Mybatis 面试题及答案(最全版本持续更新)
- UART的RTS和CTS
- 服务器域名修改,服务器修改域名
- APP界面保持屏幕常亮方法
- 大数据、云计算、物联网、数据库、数据仓库、OLAP、OLTP等学习大数据你必须了解的概念,我的学习总结
- JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2
- cocos2d-x 学习笔记(3)cocos2d-x 创建基本控件 及小动画
- 绪论(p1-p2) author:run
- 文件服务器 架构,文件服务器架构规划