力扣1709-访问日期之间的最大的空档期
2026/7/5 22:58:36 网站建设 项目流程

表:UserVisits

+-------------+------+ | Column Name | Type | +-------------+------+ | user_id | int | | visit_date | date | +-------------+------+ 该表没有主键,它可能有重复的行 该表包含用户访问某特定零售商的日期日志。

假设今天的日期是'2021-1-1'

编写解决方案,对于每个user_id,求出每次访问及其下一个访问(若该次访问是最后一次,则为今天)之间最大的空档期天数window

返回结果表,按用户编号user_id排序。

结果格式如下示例所示:

示例 1:

输入:UserVisits 表: +---------+------------+ | user_id | visit_date | +---------+------------+ | 1 | 2020-11-28 | | 1 | 2020-10-20 | | 1 | 2020-12-3 | | 2 | 2020-10-5 | | 2 | 2020-12-9 | | 3 | 2020-11-11 | +---------+------------+输出:+---------+---------------+ | user_id | biggest_window| +---------+---------------+ | 1 | 39 | | 2 | 65 | | 3 | 51 | +---------+---------------+解释:对于第一个用户,问题中的空档期在以下日期之间: - 2020-10-20 至 2020-11-28 ,共计 39 天。 - 2020-11-28 至 2020-12-3 ,共计 5 天。 - 2020-12-3 至 2021-1-1 ,共计 29 天。 由此得出,最大的空档期为 39 天。 对于第二个用户,问题中的空档期在以下日期之间: - 2020-10-5 至 2020-12-9 ,共计 65 天。 - 2020-12-9 至 2021-1-1 ,共计 23 天。 由此得出,最大的空档期为 65 天。 对于第三个用户,问题中的唯一空档期在 2020-11-11 至 2021-1-1 之间,共计 51 天。

思路:

  • 本题的目标是计算每个用户两次访问之间的最大时间间隔,其中最后一次访问需要与固定日期2021-01-01进行比较。

  • 首先以uservisits表为基础,按照user_id分组,并按visit_date升序排列,使用分析函数LEAD(visit_date)获取同一用户的下一次访问日期。

  • 对于存在下一次访问的记录,直接计算当前访问日期与下一次访问日期之间的日期差。

  • 对于某个用户的最后一次访问,由于LEAD函数返回NULL,因此使用CASE WHEN将下一次访问日期替换为固定日期2021-01-01,以保证时间间隔计算的完整性。

  • 使用ABS函数对日期差取绝对值,确保结果为正数,得到每次访问之间的时间间隔。

  • 将上述计算结果放入公共表表达式(CTE)中,得到每个用户每次访问对应的时间间隔。

  • 最后在外层查询中,按user_id分组,对每个用户的所有时间间隔取最大值,即得到该用户的最大访问间隔biggest_window

代码:

with t as( select user_id, abs(visit_date - case when lead(visit_date) over( partition by user_id order by visit_date ) is null then date '2021-01-01' else lead(visit_date) over( partition by user_id order by visit_date ) end ) as diff from uservisits ) select user_id,max(diff) as biggest_window from t group by user_id

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询