小工具知识网

当前位置: 首页 > 行业知识 > 力扣2752 在连续天数上进行了最多交易次数的顾客

行业知识

力扣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. 标记连续交易的开始:对于每个顾客,通过比较当前交易日与上一交易日的差异来标记连续交易的开始。如果差异大于1天,我们认为这是一个新的连续交易序列的开始。

  2. 计算连续交易的天数:为每个连续交易序列分配一个唯一标识符,然后计算每个序列的长度。

  3. 找到并返回具有最长连续交易天数的顾客:从上一步骤中找出最长的连续交易天数,并选择具有这一天数的所有顾客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排序。

    通过

上一篇:雷霆战机怎么找不到服务器?

下一篇:揭秘传送指令,探寻神秘指令背后的奥秘