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 ;

执行结果

相关推荐
倔强的石头_13 小时前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库
jiayou642 天前
KingbaseES 实战:深度解析数据库对象访问权限管理
数据库
李广坤3 天前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
爱可生开源社区4 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1774 天前
《从零搭建NestJS项目》
数据库·typescript
加号34 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏4 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐4 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再5 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
tryCbest5 天前
数据库SQL学习
数据库·sql