经典sql题(二)求连续登录最多天数用户

示例数据

假设我们的 test 表有以下数据:

id date
1 2023-10-01 08:00:00
1 2023-10-02 09:00:00
1 2023-10-03 10:00:00
1 2023-10-05 11:00:00
2 2023-10-01 10:00:00
2 2023-10-02 12:00:00
2 2023-10-03 14:00:00
2 2023-10-04 15:00:00
3 2023-10-01 16:00:00
3 2023-10-02 16:00:00
3 2023-10-03 16:00:00
3 2023-10-04 16:00:00
第一步:去重并提取日期
sql 复制代码
SELECT 
    id,
    SUBSTR(date, 1, 10) AS date1
FROM 
    test
GROUP BY 
    id, SUBSTR(date, 1, 10);

结果(表 table1):

id date1
1 2023-10-01
1 2023-10-02
1 2023-10-03
1 2023-10-05
2 2023-10-01
2 2023-10-02
2 2023-10-03
2 2023-10-04
3 2023-10-01
3 2023-10-02
3 2023-10-03
3 2023-10-04
第二步:为每个用户和日期生成序列号
sql 复制代码
SELECT 
    id,
    date1,
    DATE_SUB(date1, INTERVAL ROW_NUMBER() OVER (PARTITION BY id ORDER BY date1) DAY) AS date2
FROM (
    SELECT 
        id,
        SUBSTR(date, 1, 10) AS date1
    FROM 
        test
    GROUP BY 
        id, SUBSTR(date, 1, 10)
) AS table1;  -- 使用 'table1' 作为别名

结果(表 table2):

id date1 date2
1 2023-10-01 2023-10-01
1 2023-10-02 2023-10-01
1 2023-10-03 2023-10-01
1 2023-10-05 2023-10-04
2 2023-10-01 2023-10-01
2 2023-10-02 2023-10-01
2 2023-10-03 2023-10-01
2 2023-10-04 2023-10-01
3 2023-10-01 2023-10-01
3 2023-10-02 2023-10-01
3 2023-10-03 2023-10-01
3 2023-10-04 2023-10-01
第三步:统计每个用户的最大连续登录天数
sql 复制代码
SELECT 
    id, 
    MAX(day_cnt) AS max_day_cnt
FROM (
    SELECT 
        id,
        date2,
        COUNT(*) AS day_cnt
    FROM (
        SELECT 
            id,
            date1,
            DATE_SUB(date1, INTERVAL ROW_NUMBER() OVER (PARTITION BY id ORDER BY date1) DAY) AS date2
        FROM (
            SELECT 
                id,
                SUBSTR(date, 1, 10) AS date1
            FROM 
                test
            GROUP BY 
                id, SUBSTR(date, 1, 10)
        ) AS table1
    ) AS table2
    GROUP BY 
        id, date2
) AS final_table
GROUP BY id
ORDER BY max_day_cnt DESC
LIMIT 1;

结果(如果求的是用户天数而非用户则无需ORDER BY):

id max_day_cnt
3 4

完整步骤解析

  1. 去重提取日期

    • 查询:提取每个用户的唯一登录日期。
    • 结果表 table1:显示每个用户的唯一日期。
  2. 为每个用户生成序列号

    • 查询 :为每个用户的日期生成序号,并计算 date2
    • 结果表 table2 :显示用户的日期和对应的 date2
  3. 统计用户最大连续登录天数

    • 查询 :根据 date2 统计每个用户的连续登录天数,并通过 MAX() 函数获取每个用户的最大连续登录天数。
    • 最终结果:显示连续登录天数最多的用户及其天数。
相关推荐
求学小火龙4 分钟前
ElasticSearch介绍+使用
java·大数据·elasticsearch
檀越剑指大厂5 分钟前
【Elasticsearch系列六】系统命令API
大数据·elasticsearch·搜索引擎
数据运营新视界28 分钟前
你知道企业架构中核心的4大架构联系和不同吗?
大数据·架构
h1771134720543 分钟前
基于区块链的相亲交易系统源码解析
大数据·人工智能·安全·系统架构·交友
计算机学姐43 分钟前
基于SpringBoot+Vue的篮球馆会员信息管理系统
java·vue.js·spring boot·后端·mysql·spring·mybatis
JY_H1 小时前
MongoDB
数据库·mongodb
程序员大金1 小时前
基于SpringBoot+Vue+MySQL的智能物流管理系统
java·javascript·vue.js·spring boot·后端·mysql·mybatis
杨诚实1 小时前
20240912软考架构-------软考161-165答案解析
数据库·架构
尸僵打怪兽1 小时前
软考(中级-软件设计师)(0919)
java·c语言·数据库·计算机网络·软考·多媒体·软件设计师
litGrey2 小时前
Maven国内镜像(四种)
java·数据库·maven