目录

  • 一、题目
  • 二、解决
    • 1、join+子表+with+join+where过滤
  • 三、参考

一、题目

表: 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、join+子表+with+join+where过滤

思路:

先得到transactions_count,后visits_count,再关联过滤。

# Step 1:得到transactions_countselect v.user_id,count(t.user_id) transactions_countfrom Visits vleft join Transactions ton v.user_id = t.user_id and v.visit_date = transaction_dategroup by v.user_id,v.visit_date
  • Result:
user_id transactions_count
1 0
2 0
12 0
19 0
1 1
2 1
7 1
9 3
8 1
# Step 2:得到transactions_count与visits_countselect transactions_count,count(user_id) visits_countfrom (select v.user_id,count(t.user_id) transactions_countfrom Visits vleft join Transactions ton v.user_id = t.user_id and v.visit_date = transaction_dategroup by v.user_id,v.visit_date) agroup by transactions_count
  • Result:
transactions_count visits_count
0 4
1 5
3 1
# Step 3:准备好transactions_count行号,为关联做好准备select 0 transactions_countunionselect row_number() over (order by transaction_date) transactions_countfrom Transactions
  • Result:
transactions_count
0
1
2
3
4
5
6
7
8
# Final version
select temp2.transactions_count,ifnull(temp1.visits_count, 0) visits_count
from (select 0 transactions_countunionselect row_number() over (order by transaction_date) transactions_countfrom Transactions
) temp2
left join temp1
on temp2.transactions_count = temp1.transactions_count
where temp2.transactions_count <= (select max(transactions_count)from temp1
)
  • Result:
transactions_count visits_count
0 4
1 5
2 0
3 1

代码:

with temp1 as (select transactions_count,count(user_id) visits_countfrom (select v.user_id,count(t.user_id) transactions_countfrom Visits vleft join Transactions ton v.user_id = t.user_id and v.visit_date = transaction_dategroup by v.user_id,v.visit_date) agroup by transactions_count
)select temp2.transactions_count,ifnull(temp1.visits_count,0) visits_count
from (select 0 transactions_countunionselect row_number() over (order by transaction_date) transactions_countfrom Transactions
) temp2
left join temp1
on temp2.transactions_count = temp1.transactions_count
where temp2.transactions_count <= (select max(transactions_count)from temp1
)

三、参考

1、评论-东方萧寒

【LeetCode-SQL】1336. 每次访问的交易次数相关推荐

  1. LeetCode MySQL 1336. 每次访问的交易次数

    文章目录 1. 题目 2. 解题 1. 题目 表: Visits +---------------+---------+ | Column Name | Type | +--------------- ...

  2. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 27丨每次访问的交易次数【难度困难-提前放出来】​

    [未来的你,会感谢今天努力的你]每日两题,一难一易,每天进步一点点,可能会直接导致一场面试的成功,或工作的轻松搞定,从而升职加薪迎娶白富美,加油小伙伴!

  3. leetcode中等之1709.访问日期之间最大的空档期

    表: UserVisits Column Name Type user_id int visit_date date 该表没有主键. 该表包含用户访问某特定零售商的日期日志. 问题 假设今天的日期是 ...

  4. 通过PL/SQL developer工具访问远程的Oracle数据库_访问数据库_连接数据库_登录数据库

    文章目录 工具简介 电脑没有安装 Oracle 数据库 电脑安装了 Oracle 数据库 工具简介 PL/SQL Developer 是 Oracle 数据库开发工具,PL/SQL Developer ...

  5. 访问数,每次访问页数,平均停留时间,跳出率

    访问数,同一个 IP ,离开后再上一次,按 2 次算. 综合浏览量,所有页面点击访问总数. 每次访问页数,每次登陆网站平均点击的页面数( PV ). 网站平均停留时间,每次访问网站到离开经历的时间平均 ...

  6. oracle数据库访问sqlserver2008,透过SQL Server 2008访问Oracle 10g的配置方法

    之前写过一篇关于SQL Server 访问MySQL数据库的文章,最近正好又遇到需要访问Oracle 的情况,将配置过程记录下来也供大家参考. 准备工作 事先在需要访问Oracle 数据库的主机上完成 ...

  7. 通过SQL Server 2008 访问Oracle 10g

    之前写过一篇关于SQL Server 访问MySQL 数据库的文章,最近正好又遇到需要访问Oracle 的情况,将配置过程记录下来也供大家参考. 准备工作 事先在需要访问Oracle 数据库的主机上完 ...

  8. sqllite能连接mysql_SQLLite 可以通过SQL语言来访问的文件型SQL数据库

    Web Storage分为两类: - sessionStorage:数据保存在session 对象中(临时) - localStorage:数据保存在本地硬件设备中(永久) sessionStorag ...

  9. LeetCode(SQL)难度-中等

    LeetCode(SQL)难度-中等 注:排名知识点(题目1->思路来源于牛客-小数志(公众号)) 连续排名,例如3000,2000,2000,1000排名结果为1-2-3-4,体现同薪不同名, ...

  10. 【持续更新】Leetcode SQL题目全解析(附建表sql)

    Leetcode SQL题目全解析 越前须知(雾) 题目Q & A 175 组合两个表 181 超过经理收入的员工 182 查找重复电子邮箱 183 从不订购的用户 197 上升的温度 511 ...

最新文章

  1. 扩展 OpenLayers.Layer.WMS 为自定义的瓦片浏览服务
  2. csgo怎么控制电脑玩家_电脑远程控制怎么弄
  3. Requests库实战(三)---爬取豆瓣电影详细信息
  4. Java基础学习-IO流
  5. Java 数组常用操作一(排序、元素位置查找、添加元素、获取长度、数组反向、最大值最小值、合并、范围填充)
  6. 60 SD配置-科目分配-分配总帐科目
  7. 我遇到了Hibernate异常
  8. Lorenz.m的Matlab,matlab
  9. Golang defer 快速上手
  10. 数据结构c语言版堆排序,【数据结构】堆排序(C++实现)
  11. Jmeter (三十)jmeter+ant+jenkins持续集成
  12. 遇到问题,尽量自己解决,实在解决不了再问别人
  13. html文本框自动填充,html利用文本框input自动填写当前日期
  14. MATLAB实验总结定积分,matlab实验报告--定积分的近似计算 -
  15. 维宏控制卡四轴那个好_维宏维鸿四轴真四轴联动雕刻机运动控制卡说明书
  16. mumu模拟器Android版本才6,mumu模拟器老版本
  17. 2020年11月最新互联网大厂面试经验分享【网易、阿里、腾讯、京东、百度、爱奇艺、字节、小米、美团、搜狐、58】
  18. linux获取笔记本摄像头视频,Linux下利用Opencv打开笔记本摄像头问题
  19. Hive架构及相关函数
  20. MATLAB app designer 制作单选按钮的方法

热门文章

  1. 【深度学习基础-02】概念学习-例子3则
  2. matlab保存f黑白图片_MATLAB的矩阵运算与重构
  3. hdmi接口和计算机连接,hdmi接口,手把手教你hdmi接口怎么连接电视
  4. win10强制删除文件夹(“你需要来自XXX的权限才能对此文件夹进行更改”的解决方法)
  5. python从零基础直达神经网络之基础篇 第二章 编程基础概念(二)
  6. lpush rpush 区别_redis中lpush、rpush、lset、lrem是什么
  7. 别再问我阿里面试流程了!!!P8 面试官 花了一个月整理了这份 4000 字的 面试流程
  8. matlab有限差分一维导热,一维导热方程-有限差分法-matlab实现(汇编)
  9. 电子知识|电源管理芯片
  10. 第二课:如何选择适合做小程序的服务器及域名?