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 ;

执行结果

相关推荐
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
Gain_chance10 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
helloworldandy10 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道12 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_124987075312 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha12 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_12 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance12 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋13 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.13 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库