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;

执行结果

相关推荐
Leon-Ning Liu13 小时前
【真实经验分享】Oracle 索引并行度引发的进程风暴分析与处理
数据库·oracle
大数据魔法师13 小时前
MongoDB(十) - MongoDB分片集操作
数据库·mongodb
数据库知识分享者小北13 小时前
AnalyticDB PostgreSQL 版软件 V2.0:安全可靠的全场景一站式数据仓库
数据库·postgresql·信创数据库·安全可靠数据库·analyticdb·阿里云 analyticdb
韦胖漫谈IT13 小时前
B+ 树:为什么数据库索引偏爱它
数据库·oracle
CIO4013 小时前
IT故事(7): CIO之“10亿元库存数字化“
数据库
Database_Cool_13 小时前
PB 级海量数据需要实时分析,应该选择什么数仓产品?阿里云 AnalyticDB MySQL 是首选
数据库·数据仓库·mysql·阿里云
Nefu_lyh13 小时前
【Hive】02 Hive 分区与分桶:深入理解 Hive 分区与分桶的原理、执行过程、Bucket Map Join、SMB Join 以及最佳实践
数据仓库·hive·hadoop
该昵称用户已存在14 小时前
双碳目标下的能源中台自建之路:MyEMS 百万测点场景的架构自主权与数据库选型为题
数据库·架构·能源
二宝哥14 小时前
大数据之数据仓库与数据库区别
大数据·数据库·数据仓库
AOwhisky14 小时前
MySQL 学习笔记(第二期):SQL 语言之库表操作与数据类型
linux·运维·数据库·笔记·sql·学习·mysql