文章目录
- 题目需求
- 思路一
- 实现一
- 题目来源
题目需求
从登录明细表(user_login_detail)中查询出,所有用户的连续登录两天及以上的日期区间,以登录时间(login_ts)为准。
期望结果如下:
user_id (用户id) | start_date (开始日期) | end_date (结束日期) |
---|---|---|
101 | 2021-09-27 | 2021-09-30 |
102 | 2021-10-01 | 2021-10-02 |
106 | 2021-10-04 | 2021-10-05 |
107 | 2021-10-05 | 2021-10-06 |
需要用到的表:
登录明细表:user_login_detail
user_id(用户id) | ip_address(ip地址) | login_ts(登录时间) | logout_ts(登出时间) |
---|---|---|---|
101 | 180.149.130.161 | 2021-09-21 08:00:00 | 2021-09-27 08:30:00 |
102 | 120.245.11.2 | 2021-09-22 09:00:00 | 2021-09-27 09:30:00 |
103 | 27.184.97.3 | 2021-09-23 10:00:00 | 2021-09-27 10:30:00 |
思路一
和第二题思路相同 2. 查询至少连续三天下单的用户
实现一
-- 4) 按照 user_id, sub_res 进行分组,对每组记录进行计数,选出>=2的user_id
select user_id,
collect_list(login_ts_format)[0] as start_date,
collect_list(login_ts_format)[size(collect_list(login_ts_format)) - 1] as end_date
from (
-- 3) 计算 create_date - row_num 得到 sub_res
-- 2) 对 user_login_detail 中的每条记录编号。对 user_id 进行分组,组内按照 login_ts 升序排序,并对每条记录使用 row_number 进行编号 row_num
select user_id,
login_ts_format,
date_add(login_ts_format, -row_number() over (partition by user_id order by login_ts_format)) as sub_res
from (
-- 1) 对用户进行去重。原因:用户一天可能存在多次登录的情况,我们此处只需要一次即可
select distinct user_id,
date_format(login_ts, 'yyyy-MM-dd') as login_ts_format
from user_login_detail
) t1
) t2
group by user_id, sub_res
having count(*) >= 2;
题目来源
http://practice.atguigu.cn/#/question/15/desc?qType=SQL