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