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;

执行结果

相关推荐
Web极客码几秒前
释放WordPress磁盘空间并减少Inode使用量
服务器·数据库·ubuntu
Knight_AL3 分钟前
Redis ZSet 实现排行榜(支持分数相同按时间顺序排序)
数据库·redis·缓存
LF3_5 分钟前
hive,Relative path in absolute URI: ${system:user.name%7D 解决
数据仓库·hive·hadoop
w***95498 分钟前
mysql之如何获知版本
数据库·mysql
火星数据-Tina16 分钟前
如何构建一个支持多终端同步的体育比分网站?
大数据·前端·数据库·websocket
BD_Marathon17 分钟前
SpringMVC——5种类型参数传递
android·java·数据库
计算机毕设VX:Fegn089531 分钟前
计算机毕业设计|基于springboot + vue律师咨询系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冰冰菜的扣jio43 分钟前
入门redis——让你的查询快到起飞
数据库·redis·缓存
drebander1 小时前
MyBatis-Plus saveBatch 在异步线程中事务未提交问题排查与修复
数据库·mybatis
论迹1 小时前
【Redis】-- key的过期策略
数据库·redis·缓存