LeetCode(数据库)- 每次访问的交易次数

秒速五厘米 2022-09-11 05:24 266阅读 0赞

题目链接:点击打开链接

题目大意:略。

解题思路:注意解决方案(1)中,生成序数表可以借助于窗口函数 ROW_NUMBER() OVER();本题中如果采用解决方案(2),在第 15 个测试用例中,会出现交易表为空的情况,所以在做表连接的时候处理下笛卡儿积为空的技巧。

AC 代码

  1. -- 解决方案(1)
  2. SELECT *
  3. FROM
  4. (
  5. SELECT t5.rnb AS transactions_count, IFNULL(visits_count, 0) AS visits_count
  6. FROM
  7. (
  8. SELECT 0 AS rnb
  9. UNION
  10. SELECT ROW_NUMBER() OVER () AS rnb
  11. FROM Transactions
  12. ) t5
  13. LEFT JOIN
  14. (
  15. SELECT
  16. cnt AS transactions_count
  17. ,COUNT(user_id) AS visits_count
  18. FROM
  19. (
  20. SELECT t1.user_id, COUNT(t2.amount) AS cnt
  21. FROM Visits t1
  22. LEFT JOIN Transactions t2
  23. ON t1.user_id = t2.user_id AND t1.visit_date = t2.transaction_date
  24. GROUP BY user_id, visit_date
  25. ) t3
  26. GROUP BY cnt
  27. ) t4
  28. ON t5.rnb = t4.transactions_count
  29. ) t6
  30. WHERE transactions_count <= (
  31. SELECT COUNT(t2.amount) AS cnt
  32. FROM Visits t1
  33. LEFT JOIN Transactions t2
  34. ON t1.user_id = t2.user_id AND t1.visit_date = t2.transaction_date
  35. GROUP BY t1.user_id, visit_date
  36. ORDER BY cnt DESC
  37. LIMIT 1)
  38. ;
  39. -- 解决方案(2)
  40. # 计算每个用户每日期的交易次数
  41. WITH t1 AS(SELECT user_id, transaction_date, COUNT(*) cnt FROM Transactions GROUP BY user_id, transaction_date),
  42. # 计算每种交易次数对应的用户数(包含交易次数为 0 的情况)
  43. t2 AS(SELECT 0 transactions_count, SUM(IF(t1.cnt IS NULL, 1, 0)) visits_count
  44. FROM Visits v LEFT JOIN t1 ON v.user_id = t1.user_id AND v.Visit_date = t1.transaction_date
  45. UNION ALL
  46. SELECT cnt, COUNT(*) FROM t1 GROUP BY cnt),
  47. # 生成一张最多 Transactions.length 条记录的序数表
  48. t3 AS(SELECT CAST(@i := @i + 1 AS SIGNED) transactions_count, maxn
  49. FROM (SELECT @i:=-1, MAX(transactions_count) maxn FROM t2) init LEFT JOIN Transactions ON 1 = 1)
  50. # 为中途没有的交易次数种类填充
  51. SELECT t3.transactions_count, IFNULL(t2.visits_count, 0) visits_count
  52. FROM t3 LEFT JOIN t2 ON t3.transactions_count = t2.transactions_count
  53. WHERE t3.transactions_count <= maxn

发表评论

表情:
评论列表 (有 0 条评论,266人围观)

还没有评论,来说两句吧...

相关阅读