经典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() 函数获取每个用户的最大连续登录天数。
    • 最终结果:显示连续登录天数最多的用户及其天数。
相关推荐
GBASE4 小时前
G术时刻 |GBase 8s数据库事务并发控制之封锁技术介绍(下)
数据库
xiezhr14 小时前
逛GitHub发现了一款免费的带AI功能的数据库管理工具
数据库·ai编程·dba
大大大大晴天1 天前
Hudi Metadata Table 与 Hive Sync (HMS)怎么选?
大数据
唐青枫2 天前
MySQL JSON 实战详解:从存储、查询、更新到 JSON_TABLE 与索引
sql·mysql
吃糖的小孩2 天前
给 QQ AI 机器人设计“可控记忆”:会话摘要、手动长期记忆与角色卡边界
数据库
手可摘星辰7772 天前
一次线上FlinkCDC异常排查复盘
大数据·flink
小满8782 天前
5.Mysql事务隔离级别与锁机制
mysql
大大大大晴天2 天前
Hudi技术内幕:Metadata Table原理与实践
大数据
笃行3502 天前
金仓数据库数据安全双防线:静态存储加密与传输加密实战
数据库
笃行3502 天前
金仓数据库物理备份实战:sys_rman 全流程演练与误覆盖抢救
数据库