2228. 7 天内两次购买的用户 🔒
题目描述
表: 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\) 天的用户。若对每个用户做自连接比较全部购买对,同一用户购买次数较多时会重复计数。只需看按时间排序后的相邻两次是否已经落入窗口。
窗口函数 \(\textit{LAG}(\textit{purchase\_date})\) 按 \(\textit{user\_id}\) 分区、按日期排序,得到与上一笔的天数差。筛选 \(d \le 7\) 后再对 \(\textit{user\_id}\) 去重即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |