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


    SQL架构

    表: 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) 行)
    

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

    写一条 SQL 查询多少客户访问了银行但没有进行任何交易,多少客户访问了银行进行了一次交易等等

    结果包含两列:

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

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

    按 transactions_count 排序

    下面是查询结果格式的例子:

    Visits 表:
    +---------+------------+
    | user_id | visit_date |
    +---------+------------+
    | 1       | 2020-01-01 |
    | 2       | 2020-01-02 |
    | 12      | 2020-01-01 |
    | 19      | 2020-01-03 |
    | 1       | 2020-01-02 |
    | 2       | 2020-01-03 |
    | 1       | 2020-01-04 |
    | 7       | 2020-01-11 |
    | 9       | 2020-01-25 |
    | 8       | 2020-01-28 |
    +---------+------------+
    Transactions 表:
    +---------+------------------+--------+
    | user_id | transaction_date | amount |
    +---------+------------------+--------+
    | 1       | 2020-01-02       | 120    |
    | 2       | 2020-01-03       | 22     |
    | 7       | 2020-01-11       | 232    |
    | 1       | 2020-01-04       | 7      |
    | 9       | 2020-01-25       | 33     |
    | 9       | 2020-01-25       | 66     |
    | 8       | 2020-01-28       | 1      |
    | 9       | 2020-01-25       | 99     |
    +---------+------------------+--------+
    结果表:
    +--------------------+--------------+
    | transactions_count | visits_count |
    +--------------------+--------------+
    | 0                  | 4            |
    | 1                  | 5            |
    | 2                  | 0            |
    | 3                  | 1            |
    +--------------------+--------------+
    * 对于 transactions_count = 0, visits 中 (1, "2020-01-01"), (2, "2020-01-02"), (12, "2020-01-01") 和 (19, "2020-01-03") 没有进行交易,所以 visits_count = 4 。
    * 对于 transactions_count = 1, visits 中 (2, "2020-01-03"), (7, "2020-01-11"), (8, "2020-01-28"), (1, "2020-01-02") 和 (1, "2020-01-04") 进行了一次交易,所以 visits_count = 5 。
    * 对于 transactions_count = 2, 没有客户访问银行进行了两次交易,所以 visits_count = 0 。
    * 对于 transactions_count = 3, visits 中 (9, "2020-01-25") 进行了三次交易,所以 visits_count = 1 。
    * 对于 transactions_count >= 4, 没有客户访问银行进行了超过3次交易,所以我们停止在 transactions_count = 3 。
    
    如下是这个例子的图表:
    

     

     

    1. with recursive t as( # 用递归 显示 03(由子查询找到 transactions_count 的 最大值)数字
    2. select (select ifnull(max(ca),0) from (select # ifnull 保证 无最大值时 置零 (也就是说当transactions_count 没有大于零的值时)
    3. s1.ca,count(user_id)
    4. from
    5. (
    6. select
    7. count(amount) ca,user_id
    8. from
    9. Transactions
    10. group by
    11. user_id,Transaction_date
    12. ) s1
    13. group by
    14. s1.ca) s2) as n # 初始语句(非递归部分)
    15. union all
    16. select n-1 from t where n>0 # 递归部分语句 注意一定要大于零 这样才能保证 最小值为 0 否则 为-1
    17. )
    18. select t.n transactions_count,ifnull(ssss1.visits_count,0) visits_count from t left join (
    19. select
    20. 0 transactions_count,count(user_id) visits_count # 选出 transactions_count = 0 的客户数量(啥也没有时 输出也是 0,0)
    21. from
    22. Visits
    23. where (user_id,visit_date) not in (select user_id,Transaction_date from Transactions)
    24. union all
    25. select
    26. s1.ca transactions_count,count(user_id) visits_count #选出 transactions_count != 0 的客户数量
    27. from
    28. (
    29. select
    30. count(amount) ca,user_id
    31. from
    32. Transactions
    33. group by
    34. user_id,Transaction_date
    35. ) s1
    36. group by
    37. s1.ca
    38. ) ssss1
    39. on t.n = ssss1.transactions_count
    40. order by transactions_count

    笔记:

    MYSQL WITH recursive使用
    由于在项目中有使用到recursive,因此在此做记录

    语法
    WITH recursive 表名 AS ( 
        初始语句(非递归部分) 
        UNION ALL 
        递归部分语句
    )
    [ SELECT| INSERT | UPDATE | DELETE]
    1
    2
    3
    4
    5
    6
    用法1:输出1~n或者求 1~n的和
    WITH recursive t AS(
        SELECT 1 AS n
        UNION ALL
        SELECT n+1 FROM t WHERE n<10
    )
    SELECT * FROM t
    SELECT SUM(n) FROM t;
    ————————————————
    版权声明:本文为CSDN博主「dapeng chen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/sin_dapeng/article/details/121673632

  • 相关阅读:
    软件测试/测试开发丨利用人工智能ChatGPT编写晋级报告
    2022 年杭电多校第十场补题记录
    有效学习,通过PMP考试
    详解python中的序列类型概述
    【Azure 环境】Azure 云环境对于OpenSSL 3.x 的严重漏洞(CVE-2022-3602 和 CVE-2022-3786)的处理公告
    k8s学习之Voulumn
    libyuv 再次封装打包与测试
    【UCIe】UCIe Sideband 介绍
    shell变量
    linux安装node(含npm命令) 并配置淘宝镜像源
  • 原文地址:https://blog.csdn.net/m0_69157845/article/details/125464460