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

1 题目


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

样例数据如下 login_log:

在这里插入图片描述

2 建表语句


--建表语句
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)开窗,排序

select user_id,
       login_time,
       row_number() over (partition by user_id order by login_time) rn
from login_log;

执行结果

在这里插入图片描述

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

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 分组,获取每个用户每次连续登录的天数

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)得出每个用户最大连续登录天数

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 ;

执行结果

在这里插入图片描述

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 05:28:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 05:28:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 05:28:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 05:28:02       55 阅读

热门阅读

  1. 编程中的智慧五:工厂设计模式

    2024-07-22 05:28:02       20 阅读
  2. 模型瘦身术:目标检测中的剪枝与量化

    2024-07-22 05:28:02       18 阅读
  3. 前端面试题日常练-day100 【Less】

    2024-07-22 05:28:02       15 阅读
  4. C++顶层const和底层const

    2024-07-22 05:28:02       17 阅读
  5. HOW - React 处理不紧急的更新和渲染

    2024-07-22 05:28:02       18 阅读
  6. kafka 基础知识

    2024-07-22 05:28:02       16 阅读
  7. 欧拉路径与欧拉回路

    2024-07-22 05:28:02       19 阅读
  8. Linux grep技巧 提取log中的json数据

    2024-07-22 05:28:02       13 阅读
  9. Python 异常处理

    2024-07-22 05:28:02       14 阅读
  10. Python中的__new__方法及实现单例模式

    2024-07-22 05:28:02       14 阅读
  11. FlowUs横向对比几款笔记应用的优势所在

    2024-07-22 05:28:02       16 阅读
  12. 公式推导类

    2024-07-22 05:28:02       17 阅读