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,得到表格T1SELECT * FROM TransactionsUNION ALLSELECT user_id, visit_date AS transaction_date, 0 AS amountFROM Visits
), T2 AS (# 第二步,T1中,以user_id,transaction_date作为主键,对(amount>0)的求和,得到每个用户每次访问的交易次数,记为字段transactions_count,得到表格T2SELECT SUM(amount > 0) AS transactions_countFROM T1GROUP BY user_id, transaction_date
), T3 AS (# 第三步,T2中,统计所有transactions_count出现的次数,记为字段visits_count,得到表格T3SELECT transactions_count, COUNT(transactions_count) AS visits_countFROM T2GROUP BY transactions_count
), T4 AS (# 第四步,获取递归的构建transactions_count=0-MAX(transactions_count)的表格T4SELECT 0 AS transactions_countUNION ALL SELECT transactions_count + 1 AS transactions_countFROM 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