假设有如下表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天的用户信息相关推荐

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

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

  2. mysql 连续七天不登录_【SQL】查询连续登陆7天以上的用户

    查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助. 具体思路: 1.因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重. 2.再用row ...

  3. mysql连续登录5天以上用户,【SQL】查询连续登陆7天以上的用户

    查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助. 具体思路: 1.因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重. 2.再用row ...

  4. 查询连续登陆7天以上的用户 Mysql

    查询7天连续登陆用户这个问题很经典,解决方法也有很多,这里我讲一下笔者的方法,希望对大家有帮助. 具体思路: 1.因为每天用户登录次数可能不止一次,所以需要先将用户每天的登录日期去重. 2.再用row ...

  5. 用sql语句查询出每门课都大于80 分的学生姓名案例解析

    用一条SQL 语句 查询出每门课都大于80 分的学生姓名 name course grade 张三 语文 81 张三 数学 75 李四 语文 76 李四 数学 90 王五 语文 81 王五 数学 10 ...

  6. 关于主从复制的超详细解析(全)

    目录 前言 1. 主从复制 1.1 方式 2. Mysql的主从复制 2.1 一主一从 2.1.1 window和linux通讯 2.1.2 linux和linux的通讯 2.2 双主双从 3. Re ...

  7. HIVE:窗口函数,用sql语句查询MySQL安装路径和版本

    数据大师: Jmx's Blog | Keep it Simple and Stupid! 猴子 - 知乎公众号(猴子数据分析)著有畅销书<数据分析思维>科普中国专家 回答数 647,获得 ...

  8. sql语句查询过慢的原因分析

    有时候你在使用sql语句查询数据库,sql语句写得好正确,但则发现执行查询的时候很慢呢?数据量也不是太大,你知道其中的原因吗?本文给大家讲解一下sql查询过慢的48种原因分析,请阅读. 1.没有索引或 ...

  9. thinkphp5基本的一些操作/API友好/获取请求信息(Request)/判断请求类型(GET...)/验证参数数据(Validate)/连接数据库/原生sql语句查询

    文章目录 一.API友好 1.举两个thinkphp5关于API友好的例子 (1)数据输出 (2)错误调试Trace 二.获取请求信息(Request) 1.获取URL信息 2.获取 模块/控制器/操 ...

最新文章

  1. plsql连接oracle报错12514,plsql 登录 oracle11 12514 错误的处理方法
  2. 自由自在休闲食品实现奶茶妹的创业梦
  3. python中thread的setDaemon、join的用法
  4. 晚上不睡觉,搞的一个例子《JS实现动画》
  5. 电视剧潜伏的真正结局
  6. input中autocomplete属性
  7. jQuery学习(十二)—jQuery中对象的查找方法总结
  8. MongoDB数据库(二):增删查改
  9. 【HDOJ4699】Editor(对顶栈,模拟)
  10. Spring 框架蕴含的设计思想
  11. 谷歌浏览器无法登陆问题
  12. 逆向序列号生成算法(三)
  13. 数字基础设施可视化管理,任重而道远
  14. Nacos 中配置 Map 类型,不香
  15. 15 | 网络优化(上):移动开发工程师必备的网络优化知识
  16. 栈帧ebp,esp详解
  17. 从excel中读取信号,首先计算信号的vmd分解,得到imf分量
  18. Git提交指定的文件
  19. python扫雷 高级算法_利用Python实现自动扫雷
  20. 2022年黄石助理工程师职称申报材料需要准备哪些?

热门文章

  1. 顺丰慢吗,了解这些问题你就能得到答案
  2. 2020 java Mybatis 面试题及答案(最全版本持续更新)
  3. UART的RTS和CTS
  4. 服务器域名修改,服务器修改域名
  5. APP界面保持屏幕常亮方法
  6. 大数据、云计算、物联网、数据库、数据仓库、OLAP、OLTP等学习大数据你必须了解的概念,我的学习总结
  7. JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2
  8. cocos2d-x 学习笔记(3)cocos2d-x 创建基本控件 及小动画
  9. 绪论(p1-p2) author:run
  10. 文件服务器 架构,文件服务器架构规划