经典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() 函数获取每个用户的最大连续登录天数。
    • 最终结果:显示连续登录天数最多的用户及其天数。
相关推荐
Yng Forever3 分钟前
解决Elasticsearch端口冲突:修改cpolar端口
大数据·elasticsearch·搜索引擎
IManiy12 分钟前
总结之数据清洗框架DBT
大数据
老徐电商数据笔记25 分钟前
技术复盘第四篇:Kimball维度建模在电商场景的实战应用
大数据·数据仓库·技术面试
·云扬·32 分钟前
InnoDB事务隔离级别与加锁机制深度解析
数据库·sql·mysql
不穿格子的程序员38 分钟前
Redis篇8——Redis深度剖析:揭秘 Redis 高性能
数据库·redis·缓存·nio·io多路复用
四谎真好看41 分钟前
MySQL 学习笔记(进阶篇2)
笔记·学习·mysql·学习笔记
计算机毕设指导644 分钟前
基于微信小程序的校园物品租赁与二手交易系统【源码文末联系】
spring boot·mysql·微信小程序·小程序·tomcat·maven·intellij-idea
科技小金龙1 小时前
小程序/APP接入分账系统:4大核心注意事项,避开合规与技术坑
大数据·人工智能·小程序
科学最TOP1 小时前
xLSTM-Mixer:基于记忆混合的多变量时间序列预测
大数据·人工智能·算法·机器学习·时间序列
LF3_1 小时前
Centos7,单机搭建Hadoop3.3.6伪分布式集群
大数据·hadoop·伪分布式