首页 > 数据库 >SQL查询连续登录用户

SQL查询连续登录用户

时间:2022-11-28 19:44:51浏览次数:33  
标签:11 登录 查询 user 2022 SQL id login dt

问题:如何判读用户连续5天登录过系统?

1.环境
MySQL 8.0.21

2.准备测试数据

create table report_user_login(id bigint auto_increment primary key comment '主键ID', user_id varchar(10) comment '用户ID', login_dt date comment '登录日期');

insert into report_user_login(user_id, login_dt) 
values ('alex', '2022-11-01'), ('alex', '2022-11-02'), ('alex', '2022-11-03'), ('alex', '2022-11-04'), ('alex', '2022-11-04');

insert into report_user_login(user_id, login_dt) 
values ('alex', '2022-11-01'), ('Jobs', '2022-11-02'), ('Jobs', '2022-11-03'), ('alex', '2022-11-04'), ('Jobs', '2022-11-04');

insert into report_user_login(user_id, login_dt) 
values ('Steven', '2022-11-01'), ('Steven', '2022-11-02'), ('alex', '2022-11-03'), ('Steven', '2022-11-04'), ('Steven', '2022-11-04');

insert into report_user_login(user_id, login_dt) 
values ('alex', '2022-11-01'), ('alex', '2022-11-05'), ('alex', '2022-11-03'), ('alex', '2022-11-04'), ('alex', '2022-11-07');

3.实现方式一,只用找出用户,不判断具体从哪一天开始连续登录

-- 1.按照用户和日期去重
-- 2. 构建连续差值的等值
-- 3. 用户和等值分组计数,可以得到用户是否连续
with a1 as (
select distinct a.user_id, a.login_dt from report_user_login a)
, a2 as (select a1.user_id,a1.login_dt,row_number() over(partition by user_id order by login_dt) as rwn
from a1)
select user_id  from a2 group by user_id,date_sub(login_dt, interval rwn day) having count(1) >4;

 

4.实现方式二,找出用户,且查出具体从哪一天开始连续登录的

-- 1.按照用户和日期去重
-- 2.构建每个日期的连续日期,通过日期+具体的数字和不等式来实现关联,相当于扩建了倍数
-- 3.分组count by 取出 对应的值
with a1 as (
select distinct a.user_id, a.login_dt from report_user_login a),
a2 as (select a1.user_id,a1.login_dt,a1.login_dt +1 as dt, aa.user_id user_idaa,aa.login_dt login_dtaa
from a1 left join a1 as aa on a1.user_id = aa.user_id and a1.login_dt <= aa.login_dt and a1.login_dt +4 >= aa.login_dt)
select user_id, login_dt from a2 group by user_id, login_dt having count(*) >=5 ;

 

标签:11,登录,查询,user,2022,SQL,id,login,dt
From: https://www.cnblogs.com/Alex-Zeng/p/16933391.html

相关文章

  • MySQL日志管理、备份与恢复
    一.MySQL日志管理MySQL的日志默认保存位置为/usr/local/mysql/dataMySQL的日志配置文件为/etc/my.cnf ,里面有个[mysqld]项修改配置文件:vim/etc/my.cnf[mysqld]1......
  • python第三方模块之pymysql
    python第三方模块之pymysql首先我们要先向解释器中安装pymysql模块:pippymysql--install与数据库建立连接conn=pymysql.connect(host='127.0.0.1',#与本地......
  • 可视化软件Navicat与pymysql模块
    第三方开发的用来充当数据库客户端的简单快捷的操作界面 无论第三方软件有多么的华丽呼哨,底层的本质还是SQL能够操作数据库的第三方可视化软件有很多,其中针对MySQL最出门......
  • mysql多表查询
    今日内容概要多表查询的两种方法小知识点补充说明可视化软件Navicat多表查询练习题python操作MySQL今日内容详细方式1:连表操作 innerjoin 内连接 selec......
  • SQL语句执行顺序,select、from、where、group by、having、order by语句位置及功能详解
    在spl语句中的执行顺序:from→where→groupby→having→select→orderby第一步:from语句,选择要操作的表。第二步:where语句,在from后的表中设置筛选条件,筛选出符合条件的......
  • MySQL事务和存储引擎
    一、MySQL事务概述1.1、MySQL事务简介MySQL事务是访问并更新数据库中各种数据项的一个程序执行单元。在事务中的操作,要么都执行修改,要么都不执行,这就是事务的目的,也是事......
  • MySQL中的索引
    一、索引的概念索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。使用索引后可......
  • 多表查询两种方法、可视化软件navicat、python操作mysql、pymysql模块
    目录多表查询的思路多表查询的两种方法小知识点补充数说明可视化软件Navicat多表查询练习题python操作MySQLpymysql补充说明多表查询的思路表数据准备表数据准备creat......
  • skywalking启动配置agent及数据储存对数据源(mysql,es)版本要求
    skywalking启动配置agent及数据储存对数据源(mysql,es)版本要求#skywalking-agent.jar的本地磁盘路径-javaagent:D:\SkyWalking\skywalking-agent\skywalking-agent.jar#......
  • Mysql 基础概念
      一、数据库的基本概念1、数据库的组成2、数据库的管理系统(DBMS)3、数据库系统(DBS) 二、主流数据库 三、关系数据库 四、非关系数据库 五、关系数据库和非关......