一、力扣链接
LeetCode_1709
二、题目描述
表: UserVisits
+-------------+------+ | Column Name | Type | +-------------+------+ | user_id | int | | visit_date | date | +-------------+------+ 该表没有主键,它可能有重复的行 该表包含用户访问某特定零售商的日期日志。
假设今天的日期是 '2021-1-1'
。
编写解决方案,对于每个 user_id
,求出每次访问及其下一个访问(若该次访问是最后一次,则为今天)之间最大的空档期天数 window
。
返回结果表,按用户编号 user_id
排序。
三、目标拆解
四、建表语句
Create table If Not Exists UserVisits(user_id int, visit_date date)
Truncate table UserVisits
insert into UserVisits (user_id, visit_date) values ('1', '2020-11-28')
insert into UserVisits (user_id, visit_date) values ('1', '2020-10-20')
insert into UserVisits (user_id, visit_date) values ('1', '2020-12-3')
insert into UserVisits (user_id, visit_date) values ('2', '2020-10-5')
insert into UserVisits (user_id, visit_date) values ('2', '2020-12-9')
insert into UserVisits (user_id, visit_date) values ('3', '2020-11-11')
五、过程分析
1、给每个用户增加一行记录,分组排序
2、窗口函数求差值
3、分组求最大值
六、代码实现
with t1 as(
select user_id, visit_date from uservisits
union all
select user_id, '2021-01-01' from uservisits
)
# select * from t1;
,t2 as(
select user_id,
visit_date,
lead(visit_date,1,visit_date) over(partition by user_id order by visit_date) lead_date,
datediff(lead(visit_date,1,visit_date) over(partition by user_id order by visit_date), visit_date) diff
from t1
)
select user_id, max(diff) biggest_window
from t2
group by user_id;
七、结果验证
八、小结
1、增加行记录 + union + 窗口函数 + group by
2、MySQL中union/union all 用法