SQL面试题练习 —— 统计最大连续登录天数区间

目录

  • [1 题目](#1 题目)
  • [2 建表语句](#2 建表语句)
  • [3 题解](#3 题解)

1 题目

2 建表语句

sql 复制代码
CREATE TABLE IF NOT EXISTS user_login_tb (
    uid INT,
    login_date DATE
);
insert into user_login_tb(uid, login_date) values
	( 1, '2022-08-02')
	,(1, '2022-08-03')
	,(2, '2022-08-03')
	,(2, '2022-08-04')
	,(2, '2022-08-05')
	,(2, '2022-08-05')
	,(3, '2022-08-05')
	,(2, '2022-08-06')
	,(4, '2022-08-06')
	,(4, '2022-08-07');

3 题解

sql 复制代码
WITH t AS (SELECT uid,
                  login_date,
                  ROW_NUMBER() OVER (PARTITION BY uid ORDER BY login_date) AS rn
           FROM user_login_tb
           group by uid, login_date -- 一个用户一天可能多次登录
)
SELECT part                AS days_range,
       COUNT(DISTINCT uid) AS user_num
FROM (SELECT uid,
             dd,
             COUNT(*) AS cnd,
             CASE
                 WHEN COUNT(*) < 2 THEN '未连续登录'
                 WHEN COUNT(*) < 4 THEN '连续登录2~3天'
                 WHEN COUNT(*) < 8 THEN '连续登录4~7天'
                 ELSE '连续登录大于7天'
                 END  AS part
      FROM (SELECT *,
                   DATE_SUB(login_date, rn) AS dd
            FROM t) t1
      GROUP BY uid, dd) t2
GROUP BY part
-- 记住sql的执行顺序
-- FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING -> SELECT -> DISTINCT -> ORDER BY -> LIMIT
ORDER BY user_num DESC;

执行结果

相关推荐
廋到被风吹走6 分钟前
【数据库】【MySQL】分区表深度解析:架构设计与大数据归档实践
android·数据库·mysql
馨谙10 分钟前
面试题----用户,组,su,su-,sudo,sudo-,nologin shell
java·前端·数据库
技术净胜20 分钟前
Sharding-JDBC实现完整的分库分表步骤
数据库
哈哈老师啊24 分钟前
Springboot企业办公信息化管理系统6z1v1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
坠金28 分钟前
mysql中in和exist区别
数据库·mysql
永远是我的最爱38 分钟前
基于ASP.NET的图书管理系统的设计与实现
前端·后端·sql·visual studio
l1t43 分钟前
duckdb数据库CROSS JOIN LATERAL 中使用 EXISTS子查询的一个bug
数据库·bug
wregjru1 小时前
【C++】2.10智能指针详解
数据库·redis·mysql
2401_858286111 小时前
从Redis 8.4.0源码看快速排序(1) 宏函数min和swapcode
c语言·数据库·redis·缓存·快速排序·宏函数
茁壮成长的露露1 小时前
MongoDB单机安装
数据库·mongodb