行业知识
力扣2752 在连续天数上进行了最多交易次数的顾客
2026-10-30 19:35:14
来源:互联网转载
�� 在处理数据库和进行数据分析时,我们经常会遇到需要识别和分析连续事件的情况。本文将通过一个具体的例子——使用SQL语言找到在连续天数上进行了最多交易的顾客——来介绍如何处理此类问题。
目录
题目描述
思路整理
完整代码及解释
题目描述
表: Transactions
+------------------+------+| 列名 | 类型 |+------------------+------+| transaction_id | int || customer_id | int || transaction_date | date || amount | int |+------------------+------+transaction_id 是这个表的具有唯一值的列。 每行包含有关交易的信息,包括唯一的(customer_id,transaction_date)以及相应的 customer_id 和 amount。
编写一个解决方案,找到连续天数上进行了最多交易的所有 customer_id 。
返回所有具有最大连续交易次数的 customer_id 。结果表按 customer_id 的 升序 排序。
结果的格式如下所示。
示例 1:
输入:Transactions 表:+----------------+-------------+------------------+--------+| transaction_id | customer_id | transaction_date | amount |+----------------+-------------+------------------+--------+| 1 | 101 | 2023-05-01 | 100 || 2 | 101 | 2023-05-02 | 150 || 3 | 101 | 2023-05-03 | 200 || 4 | 102 | 2023-05-01 | 50 || 5 | 102 | 2023-05-03 | 100 || 6 | 102 | 2023-05-04 | 200 || 7 | 105 | 2023-05-01 | 100 || 8 | 105 | 2023-05-02 | 150 || 9 | 105 | 2023-05-03 | 200 |+----------------+-------------+------------------+--------+输出:+-------------+| customer_id | +-------------+| 101 | | 105 | +-------------+解释:- customer_id 为 101 共有 3 次交易,且全部是连续的。- customer_id 为 102 共有 3 次交易,但只有其中 2 次是连续的。- customer_id 为 105 共有 3 次交易,且全部是连续的。 总的来说,最大连续交易次数为 3,由 customer_id 为 101 和 105 的完成。customer_id 按升序排序。
思路整理
-
标记连续交易的开始:对于每个顾客,通过比较当前交易日与上一交易日的差异来标记连续交易的开始。如果差异大于1天,我们认为这是一个新的连续交易序列的开始。
-
计算连续交易的天数:为每个连续交易序列分配一个唯一标识符,然后计算每个序列的长度。
-
找到并返回具有最长连续交易天数的顾客:从上一步骤中找出最长的连续交易天数,并选择具有这一天数的所有顾客ID。
完整代码及解释
WITH DateDiffs AS ( SELECT customer_id, transaction_date, IFNULL(DATEDIFF(transaction_date, LAG(transaction_date) OVER (PARTITION BY customer_id ORDER BY transaction_date)), 0) AS diff FROM Transactions),Sequences AS ( SELECT customer_id, transaction_date, SUM(diff > 1 OR diff = 0) OVER (PARTITION BY customer_id ORDER BY transaction_date) AS seq FROM DateDiffs),ConsecutiveCounts AS ( SELECT customer_id, COUNT(*) AS consecutive_days FROM Sequences GROUP BY customer_id, seq),MaxConsecutive AS ( SELECT MAX(consecutive_days) AS max_days FROM ConsecutiveCounts)SELECT customer_idFROM ConsecutiveCountsWHERE consecutive_days = (SELECT max_days FROM MaxConsecutive)ORDER BY customer_id;
-
DateDiffs:这个临时表使用DATEDIFF函数和LAG窗口函数来计算每个顾客的当前交易日与上一交易日的日期差异。
-
Sequences:在这个阶段,我们为每个顾客的连续交易序列分配一个序列号。如果diff大于1或等于0(表示非连续或是第一条记录),序列号增加。
-
ConsecutiveCounts:这里我们计算每个连续交易序列的长度,即连续交易的天数。
-
MaxConsecutive:找出所有连续交易天数中的最大值。
-
最后,我们选择那些连续交易天数等于最大天数的顾客ID,并按顾客ID排序。
通过
上一篇:雷霆战机怎么找不到服务器?