一、数据源
表: Purchases
+---------------+------+ | Column Name | Type | +---------------+------+ | purchase_id | int | | user_id | int | | purchase_date | date | +---------------+------+ purchase_id 包含唯一值。 该表包含用户从某个零售商购买的日期的日志。
编写解决方案,获取 最多 间隔 7
天进行两次购买的用户的 id。
返回按 user_id
排序的结果表。
结果格式如下所示。
示例 1:
输入: Purchases 表: +-------------+---------+---------------+ | purchase_id | user_id | purchase_date | +-------------+---------+---------------+ | 4 | 2 | 2022-03-13 | | 1 | 5 | 2022-02-11 | | 3 | 7 | 2022-06-19 | | 6 | 2 | 2022-03-20 | | 5 | 7 | 2022-06-19 | | 2 | 2 | 2022-06-08 | +-------------+---------+---------------+ 输出: +---------+ | user_id | +---------+ | 2 | | 7 | +---------+ 解释: 用户 2 在 2022-03-13 和 2022-03-20 有两次购买。由于第二次购买是在第一次购买后的 7 天内,我们添加了他们的 ID。 用户 5 只购买了 1 次。 用户 7 在同一天有两次购买,所以我们添加了他们的 ID。
二、分析
我们要找到7天内多次购买的用户,所以要找到先找到每个人当前购买时间和下一次购买的时间,将其作为一个临时表,在临时表中,当一个人没有下次购买时间时,那么他的下次购买时间就为空,不符合题目要求,所以需要去除空值,然后使用datediff函数筛选出最多间隔7天进行两次购买的用户的 id。
三、代码
with t1 as ( -- 先找到每个人当前购买时间和下一次购买的时间
select purchase_id,
user_id,
purchase_date,
lead(purchase_date) over (partition by user_id order by purchase_date) ld
from purchases
order by purchase_id
)
select distinct user_id
from t1
where ld is not null -- 当一个人没有下次购买时间时,那么他的ld就为空,也不符合题目要求,所以就去除空值
and
datediff(ld,purchase_date)<=7 -- 使用datediff函数删选出最多间隔7天进行两次购买的用户的 id。
order by user_id;
四、总结
每次看到这种类型题时,就需要考虑本次、上次、下次的时间,然后再进行下一步操作。
标签:purchase,2228,力扣,购买,2022,date,天内,id,user From: https://blog.csdn.net/dhdbanwan/article/details/143822269