SQL面试题练习 —— 查询每个用户最大连续登录天数

目录

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

1 题目

查询每个用户最大连续登录天数

样例数据如下 login_log:

2 建表语句

sql 复制代码
--建表语句
create table if not exists login_log
(
    user_id        int comment '用户id',
    login_time date comment '登录时间'
);
--数据插入
INSERT overwrite table login_log
VALUES (1, '2022-11-28'),
       (1, '2022-12-01'),
       (1, '2022-12-02'),
       (1, '2022-12-03'),
       (2, '2022-12-01'),
       (2, '2022-12-04');

3 题解

(1)开窗,排序

sql 复制代码
select user_id,
       login_time,
       row_number() over (partition by user_id order by login_time) rn
from login_log;

执行结果

(2)利用等差数列的特性,如果是连续登录,login_time - num 则相等。

sql 复制代码
select user_id,
       login_time,
       -- 在Hive中,DATE_SUB函数只能以天为单位进行操作。DATE_SUB用于从指定日期减去指定天数。
       date_sub(login_time, rn) as diff
from (select user_id,
             login_time,
             row_number() over (partition by user_id order by login_time) as rn
      from login_log) t

(3)按照 diff 分组,获取每个用户每次连续登录的天数

sql 复制代码
select user_id,
       diff,
       count(*) days
from (select user_id,
             login_time,
             -- 在Hive中,DATE_SUB函数只能以天为单位进行操作。DATE_SUB用于从指定日期减去指定天数。
             date_sub(login_time, rn) as diff
      from (select user_id,
                   login_time,
                   row_number() over (partition by user_id order by login_time) as rn
            from login_log) t) tt
group by user_id,diff;

执行结果

(4)得出每个用户最大连续登录天数

sql 复制代码
select user_id,
       max(days) as max_days
from
(select user_id,
       diff,
       count(*) days
from (select user_id,
             login_time,
             -- 在Hive中,DATE_SUB函数只能以天为单位进行操作。DATE_SUB用于从指定日期减去指定天数。
             date_sub(login_time, rn) as diff
      from (select user_id,
                   login_time,
                   row_number() over (partition by user_id order by login_time) as rn
            from login_log) t) tt
group by user_id,diff) ttt
group by user_id ;

执行结果

相关推荐
coderWangbuer41 分钟前
基于springboot的二手物品管理系统的设计与实现 (含源码+sql+视频导入教程)
spring boot·后端·sql
2401_858120262 小时前
探索Oracle数据库的多租户特性:架构、优势与实践
数据库·oracle·架构
pokemon..3 小时前
MySQL主从复制与读写分离
数据库·mysql
码农鑫哥的日常3 小时前
MySQL高可用配置及故障切换
数据库·mysql
longlongqin3 小时前
redis的 stream数据类型实现 消息队列?
数据库·redis·缓存
wrx繁星点点4 小时前
多个线程同时写入一个共享变量,会发生什么问题?如何解决?
java·开发语言·数据库
鲨鱼辣椒ii4 小时前
sql中索引查看是否生效
数据库·sql
网安大师兄4 小时前
如何逼自己自学三个月——网络安全(黑客技术)
网络·sql·学习·安全·web安全·网络安全
leidata5 小时前
MySQL系列—10.Innodb行格式
数据库·mysql
阿维的博客日记5 小时前
聚簇索引和二级索引
数据库·聚簇索引·二级索引