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;

执行结果

相关推荐
程序员小白条14 分钟前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
liulilittle20 分钟前
C++ 浮点数封装。
linux·服务器·开发语言·前端·网络·数据库·c++
郭涤生28 分钟前
QT 架构笔记
java·数据库·系统架构
韩立学长28 分钟前
基于Springboot流浪动物领养网站0kh2iyb4(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
DBA小马哥34 分钟前
Oracle迁移到金仓数据库:完整迁移步骤与兼容性优化实战
数据库·oracle·国产化平替
@nengdoudou1 小时前
KStudio 客户端无法访问 KES 数据库服务器的指定 IP / 端口
数据库
宋军涛2 小时前
记一次Sqlserver数据库存储过程调用导致的连接池耗尽事件
数据库
前端小臻2 小时前
MySQL 错误 1005 (errno: 150) 深度解析与解决方案
数据库·mysql
魔镜前的帅比2 小时前
向量数据库原理
数据库·人工智能
Dev7z2 小时前
在MySQL里创建数据库
android·数据库·mysql