MySQL计算连续3天登陆的用户

 更新时间:2023年05月25日 10:41:51   作者:sdez12  
本文主要介绍了MySQL计算连续3天登陆的用户,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

题目

table_a ( 用户userid和登录时间time)求连续登录3天的用户数。

一、解题思路

①可以使用窗口函数,根据用户分组然后再根据登录时间升序,再进行编号,这里的编号函数可以使用row_number()、dense_rank()、rank()都可以,因为同一用户不可能在同一时间登录,所以同一用户不可能出现两个完全相同的时间。
②如果两个时间连续,必定登录的时间减去编号天数是相同的
③相同个数大于3的用户即为所求

二、具体步骤

1.窗口函数得到编号(date_)

代码如下(示例):

SELECT * ,dense_rank() OVER(PARTITION BY userid ORDER BY time)date_ FROM user

运行结果如图:

2.使用登录时间减去编号对应的天数得到参照时间(flag_date),再将参照日期用date()函数转换为日期

代码如下(示例):

SELECT *,date(date_sub(time,INTERVAL  date_ DAY )) flag_date FROM (
SELECT * ,dense_rank() OVER(PARTITION BY userid ORDER BY time)date_ FROM user)a

运行结果如图:

3.最后根据userid和flag_date分组,并统计次数,次数大于等于3即为所求

代码如下(示例):

SELECT userid FROM (SELECT userid,
                           DATE(DATE_SUB(time, INTERVAL date_ DAY)) flag_date
                    FROM
                        (SELECT *, DENSE_RANK() OVER (PARTITION BY userid ORDER BY time) date_ FROM user) a
                    GROUP BY userid, flag_date
HAVING
    COUNT(flag_date) >= 3) b

三、题目使用的表和数据

CREATE TABLE `user` (
  `userid` int DEFAULT NULL,
  `time` datetime DEFAULT NULL
);
INSERT INTO user VALUES (1,'2019-01-01 12:34:22'),(2,'2019-01-01 12:22:22'),
                        (3,'2019-01-03 12:34:22'),(1,'2019-01-02 12:34:22'),
                        (2,'2019-01-03 12:34:20'),(3,'2019-01-03 12:34:10'),
                        (2,'2019-01-04 12:34:20'),(1,'2019-01-03 12:34:20'),
                        (3,'2019-01-02 12:34:20'),(4,'2022-08-01 19:43:00'),
                        (4,'2022-08-02 19:43:09'),(3,'2019-01-04 12:34:20')

到此这篇关于MySQL计算连续3天登陆的用户的文章就介绍到这了,更多相关MySQL 连续3天登陆内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL新手入门进阶语句汇总

    MySQL新手入门进阶语句汇总

    这篇文章主要给大家介绍了关于MySQL新手入门进阶语句的相关资料,总结分析了MySQL数据库常用的查询、条件查询、排序、连接查询、子查询等相关操作技巧,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-09-09
  • 数据库面试必备之MySQL中的乐观锁与悲观锁

    数据库面试必备之MySQL中的乐观锁与悲观锁

    这篇文章主要介绍了数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数据一致性要求极高的场景,通过加锁确保数据一致,需要的朋友可以参考下
    2025-04-04
  • C3P0连接池+MySQL的配置及wait_timeout问题的解决方法

    C3P0连接池+MySQL的配置及wait_timeout问题的解决方法

    这篇文章主要介绍了C3P0连接池+MySQL的配置及wait_timeout问题的解决方法,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • MySQL关于sql_mode解析与设置讲解

    MySQL关于sql_mode解析与设置讲解

    今天小编就为大家分享一篇关于MySQL关于sql_mode解析与设置讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Windows下mysql 8.0.28 安装配置方法图文教程

    Windows下mysql 8.0.28 安装配置方法图文教程

    这篇文章主要为大家详细介绍了Windows下mysql 8.0.28 安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • MySQL出现SQL Error (2013)连接错误的解决方法

    MySQL出现SQL Error (2013)连接错误的解决方法

    这篇文章主要介绍了MySQL出现SQL Error (2013)连接错误的解决方法,2013错误主要还是在于用户的授权问题,需要的朋友可以参考下
    2016-06-06
  • MySQL中rank() over、dense_rank() over、row_number() over用法介绍

    MySQL中rank() over、dense_rank() over、row_number()&n

    本文主要介绍了MySQL中rank() over、dense_rank() over、row_number() over用法介绍,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • MySQL如何防止SQL注入并过滤SQL中注入的字符

    MySQL如何防止SQL注入并过滤SQL中注入的字符

    SQL注入是指在输入参数中添加一些特殊字符(例如单引号),使输入的语句成为一段单独的可执行的SQL语句,这篇文章主要给大家介绍了关于MySQL如何防止SQL注入并过滤SQL中注入字符的相关资料,需要的朋友可以参考下
    2024-02-02
  • MySQL中的聚合查询和联合查询操作代码

    MySQL中的聚合查询和联合查询操作代码

    这篇文章主要介绍了MySQL中的聚合查询和联合查询操作代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 为什么MySQL 删除表数据 磁盘空间还一直被占用

    为什么MySQL 删除表数据 磁盘空间还一直被占用

    这篇文章主要讨论为什么MySQL 删除表数据 磁盘空间还一直被占用,项目中使用Mysql作为数据库,对于表来说,一般为表结构和表数据。表结构占用空间都是比较小的,一般都是表数据占用的空间。接下来小编就和大家一起进入下面文章内容的学习
    2021-10-10

最新评论