Leetcode 1336. 每次访问的交易次数

1.题目基本信息

1.1.题目描述

表: Visits

+---------------+---------+

| Column Name | Type |

+---------------+---------+

| user_id | int |

| visit_date | date |

+---------------+---------+

(user_id, visit_date) 是该表的主键(具有唯一值的列的组合)

该表的每行表示 user_id 在 visit_date 访问了银行

表: Transactions

+------------------+---------+

| Column Name | Type |

+------------------+---------+

| user_id | int |

| transaction_date | date |

| amount | int |

+------------------+---------+

该表可能有重复行

该表的每一行表示 user_id 在 transaction_date 完成了一笔 amount 数额的交易

可以保证用户 (user) 在 transaction_date 访问了银行 (也就是说 Visits 表包含 (user_id, transaction_date) 行)

银行想要得到银行客户在一次访问时的交易次数和相应的在一次访问时该交易次数的客户数量的图表

编写解决方案找出多少客户访问了银行但没有进行任何交易,多少客户访问了银行进行了一次交易等等

结果包含两列:

  • transactions_count: 客户在一次访问中的交易次数
  • visits_count: 在 transactions_count 交易次数下相应的一次访问时的客户数量

transactions_count 的值从 0 到所有用户一次访问中的 max(transactions_count)

结果按 transactions_count 排序

1.2.题目地址

https://leetcode.cn/problems/number-of-transactions-per-visit/description/

2.解题方法

2.1.解题思路

递归+聚合

2.2.解题步骤

第一步,将Visits的visit_date作为transaction_date,amount看做0,和Transaction表格做UNION ALL,得到表格T1

第二步,T1中,以user_id,transaction_date作为主键,对(amount>0)的求和,得到每个用户每次访问的交易次数,记为字段transactions_count,得到表格T2

第三步,T2中,统计所有transactions_count出现的次数,记为字段visits_count,得到表格T3

第四步,获取递归的构建transactions_count=0-MAX(transactions_count)的表格T4

第五步,T4和T3作左连接,visits_count为NULL则记为0

3.解题代码

sql代码

# Write your MySQL query statement below
WITH RECURSIVE 
T1 AS (
    # 第一步,将Visits的visit_date作为transaction_date,amount看做0,和Transaction表格做UNION ALL,得到表格T1
    SELECT * FROM Transactions
        UNION ALL
    SELECT 
        user_id, 
        visit_date AS transaction_date, 
        0 AS amount
    FROM Visits
), T2 AS (
    # 第二步,T1中,以user_id,transaction_date作为主键,对(amount>0)的求和,得到每个用户每次访问的交易次数,记为字段transactions_count,得到表格T2
    SELECT 
        SUM(amount > 0) AS transactions_count
    FROM T1
    GROUP BY user_id, transaction_date
), T3 AS (
    # 第三步,T2中,统计所有transactions_count出现的次数,记为字段visits_count,得到表格T3
    SELECT 
        transactions_count, 
        COUNT(transactions_count) AS visits_count
    FROM T2
    GROUP BY transactions_count
), T4 AS (
    # 第四步,获取递归的构建transactions_count=0-MAX(transactions_count)的表格T4
    SELECT 0 AS transactions_count
        UNION ALL 
    SELECT transactions_count + 1 AS transactions_count
    FROM T4 
    WHERE transactions_count < (SELECT MAX(transactions_count) FROM T3)
)

# 第五步,T4和T3作左连接,visits_count为NULL则记为0
SELECT 
    T4.transactions_count, 
    IFNULL(visits_count, 0) AS visits_count
FROM T3 RIGHT JOIN T4 ON T3.transactions_count = T4.transactions_count
ORDER BY transactions_count

4.执行结果

posted @ 2025-06-03 10:40  Geek0070  阅读(12)  评论(0)    收藏  举报