「SQL面试题库」 No_95 每次访问的交易次数

news/2024/11/28 3:49:36/

🍅 1、专栏介绍

「SQL面试题库」是由 不是西红柿 发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。

1.1 活动流程

  1. 整理题目:西红柿每天无论刮风下雨,保证在8am 前,更新一道新鲜SQL面试真题。
  2. 粉丝打卡:粉丝们可在评论区写上解题思路,或者直接完成SQL代码,有困难的小伙伴不要着急,先看别人是怎么解题的,边看边学,不懂就问我。
  3. 交流讨论:为了方便交流讨论,可进入 数据仓库
  4. 活动奖励:我每天都会看评论区和群里的内容,对于积极学习和热心解答问题的小伙伴,红包鼓励,以营造更好的学习氛围。

1.2 你的收获

  1. 增强自信,搞定面试:在求职中,SQL是经常遇到的技能点,而这些题目也多数是真实的面试题,刷题可以让我们更好地备战面试,增强自信,提升自己的核心竞争力。

  2. 巩固SQL语法,高效搞定工作:通过不断练习,能够熟悉SQL的语法和常用函数,掌握SQL核心知识点,提高SQL编写能力。代码能力提升了,工作效率自然高了。

  3. 提高数据处理能力、锻炼思维能力:SQL是数据处理的核心工具,通过刷题可以让我们更好地理解数据处理的过程,提高数据分析的效率。SQL题目的难度不一,需要在一定时间内解决问题,培养了我们对问题的思考能力、解决问题的能力和对时间的把控能力等。

🍅 2、今日真题

题目介绍: 每次访问的交易次数 number-of-transactions-per-visit

难度困难

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 。

如下是这个例子的图表: ```

sql
SELECT *
FROM
(SELECT t5.rnb AS transactions_count, IFNULL(visits_count, 0) AS visits_countFROM(SELECT 0 AS rnbUNIONSELECT ROW_NUMBER() OVER () AS rnbFROM Transactions) t5LEFT JOIN(SELECTcnt AS transactions_count,COUNT(user_id) AS visits_countFROM(SELECT t1.user_id, COUNT(t2.amount) AS cntFROM Visits t1LEFT JOIN Transactions t2ON t1.user_id = t2.user_id AND t1.visit_date = t2.transaction_dateGROUP BY user_id, visit_date) t3GROUP BY cnt) t4ON t5.rnb = t4.transactions_count
) t6
WHERE transactions_count <= (SELECT COUNT(t2.amount) AS cntFROM Visits t1LEFT JOIN Transactions t2ON t1.user_id = t2.user_id AND t1.visit_date = t2.transaction_dateGROUP BY t1.user_id, visit_dateORDER BY cnt DESCLIMIT 1)

难点 从0自增序列,2交易的人数为0

sql
select pcnt transactions_count,count(*) visits_count
from (
select visit_date,sum(if(amount is  null,0,1)) over(partition by transaction_date ) pcnt,count(*) over(partition by  visit_date ) tcnt
from Visits v left join Transactions t
on v.user_id= t.user_id and v.visit_date=t.transaction_date
)t1
group by pcnt

这个得出结果是[0, 4], [1, 5], [3, 3] 少了[2,0] 还没想到什么好办法能把[2,0]加进去。。。

  • 已经有灵感了?在评论区写下你的思路吧!

http://www.ppmy.cn/news/338481.html

相关文章

西数硬盘 黑、红、蓝、绿、紫不同颜色系列硬盘区别

绿&#xff1a;转速低、噪音低、省电、速度慢、可靠性一般、不适合RAID&#xff0c;适合当个人电脑的仓库盘 红&#xff1a;转速低、噪音低、省电、速度慢、可靠性较高&#xff0c;适合RAID&#xff0c;适合并发量不大的NAS 蓝&#xff1a;转速高&#xff0c;噪音中、耗电中、速…

win7无法识别orico硬盘盒的解决方法

win7无法识别orico硬盘盒的解决方法 参考文章&#xff1a; &#xff08;1&#xff09;win7无法识别orico硬盘盒的解决方法 &#xff08;2&#xff09;https://www.cnblogs.com/liufofu/p/9065762.html 备忘一下。

西部数据绿盘、蓝盘、黑盘、红盘和紫盘有什么区别

西部数据硬盘绿盘\蓝盘\黑盘\红盘\紫盘的区别。大家都知道西数的硬盘有很多颜色&#xff0c;对应着不同的功能&#xff0c;很多用户不知道哪一种硬盘更加适合自己&#xff0c;下面装机之家来讲解下西部数据绿盘、蓝盘、黑盘、红盘和紫盘区别。 西数(WD)绿盘、蓝盘、黑盘、红盘和…

西数硬盘盒安装方法完整版

本文系青州小熊网站的 kokopig 所写&#xff0c;本人怕以后找不到该文而转载&#xff0c;望作者见谅 1. 论坛上任何一种安装镜像, 按一个盘的方法安装&#xff08;我安装的是0214版&#xff09;2. 把安装好的盘, 放在B槽3. 把你的新硬盘放进A槽 4. 在WEB管理介面里, 选择最后一…

元谷存储巴士T250 2.5寸USB3.0硬盘盒支持1T 串口SATA硬盘盒3.0

http://detail.tmall.com/item.htm?id14601884506&wwdialogbbxxbbmc&prt1331034541339&prc1

2023年阿里云企业云服务器c7/g7/r7价格表(配置和报价)

阿里云七代云服务器c7/g7/r7优惠价格表&#xff08;企业推荐&#xff09;&#xff1a;企业用户建议选择第七代云服务器c7、g7或r7实例&#xff0c;公网带宽可选到5M&#xff0c;系统盘40G ESSD云盘&#xff0c;CPU采用第三代Intel Xeon可扩展处理器&#xff08;Ice Lake&#x…

微型计算机的硬盘电源,17款SATA硬盘盒产品横向评测

我们如何测试 购买移动硬盘盒,大家关注的是产品的传输速度,速度的快慢则主要由电路设计以及所选用的芯片来决定。目前市面上的各种USB-SATA的主控芯片在方案上已经非常成熟,因此我们在测试前就推测,各种移动硬盘盒之间在速度上差别可能并不是非常明显。反倒是移动硬盘盒所附…

飚王硬盘盒怎么样_飚王硬盘盒怎么样

飚王 巧克力硬盘盒评测 在移动硬盘已经白菜价的今天&#xff0c;已经很少有人会自己买硬盘盒组装移动硬盘了。不过&#xff0c;对于笔记本升级SSD或者老移动硬盘盒损坏换新等情况&#xff0c;移动硬盘盒还是有些人需要的。我最近就碰到已经正常运行N年的元谷刀锋移动硬盘盒寿终…