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;

执行结果

相关推荐
醉卧考场君莫笑1 天前
sql基础操作
数据库·sql·oracle
北邮刘老师1 天前
从软件工程(SE)到智能体工程(AE):开发范式的差异与升级
数据库·人工智能·架构·软件工程·智能体·智能体互联网
Predestination王瀞潞1 天前
Java EE数据访问框架技术(第二章:Mybatis多表关系映射)
数据库
+VX:Fegn08951 天前
计算机毕业设计|基于springboot + vue酒店预约系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
wheeldown1 天前
数据库复习自用
数据库·sql·oracle
程序猿20231 天前
MySQL的锁-全局锁及表锁
数据库·mysql
ss2731 天前
线程安全三剑客:无状态、加锁与CAS
java·jvm·数据库
m0_598177231 天前
MYSQL(进阶--1)--
数据库·mysql
打不了嗝 ᥬ᭄1 天前
【MySQL】索引和事务
数据库·mysql