首页 > 数据库 >SQL实战训练之,力扣:2020. 无流量的帐户数(递归)

SQL实战训练之,力扣:2020. 无流量的帐户数(递归)

时间:2024-11-07 10:20:01浏览次数:3  
标签:account Subscriptions 力扣 2020 2021 SQL date id

目录

        一、力扣原题链接

        二、题目描述

        三、建表语句

        四、题目分析        

        五、SQL解答

        六、最终答案

        七、验证

        八、知识点


一、力扣原题链接

2020. 无流量的帐户数

二、题目描述

表: Subscriptions

+-------------+------+
| Column Name | Type |
+-------------+------+
| account_id  | int  |
| start_date  | date |
| end_date    | date |
+-------------+------+
account_id 是此表的主键列。
此表的每一行都表示帐户订阅的开始和结束日期。
请注意,始终开始日期 < 结束日期。

表: Streams

+-------------+------+
| Column Name | Type |
+-------------+------+
| session_id  | int  |
| account_id  | int  |
| stream_date | date |
+-------------+------+
session_id是该表的主键列。
account_id是订阅表中的外键。
此表的每一行都包含与会话相关联的帐户和日期的信息。

编写SQL查询以报告在 2021 购买订阅但没有任何会话的帐 户数。
查询结果格式如下例所示。

示例1:

输入: 
Subscriptions table:
+------------+------------+------------+
| account_id | start_date | end_date   |
+------------+------------+------------+
| 9          | 2020-02-18 | 2021-10-30 |
| 3          | 2021-09-21 | 2021-11-13 |
| 11         | 2020-02-28 | 2020-08-18 |
| 13         | 2021-04-20 | 2021-09-22 |
| 4          | 2020-10-26 | 2021-05-08 |
| 5          | 2020-09-11 | 2021-01-17 |
+------------+------------+------------+
Streams table:
+------------+------------+-------------+
| session_id | account_id | stream_date |
+------------+------------+-------------+
| 14         | 9          | 2020-05-16  |
| 16         | 3          | 2021-10-27  |
| 18         | 11         | 2020-04-29  |
| 17         | 13         | 2021-08-08  |
| 19         | 4          | 2020-12-31  |
| 13         | 5          | 2021-01-05  |
+------------+------------+-------------+
输出: 
+----------------+
| accounts_count |
+----------------+
| 2              |
+----------------+
解释:用户 4 和 9 在 2021 没有会话。
用户 11 在 2021 没有订阅。

三、建表语句

drop table if exists  Subscriptions;
drop table if exists  Streams;
Create table If Not Exists Subscriptions (account_id int, start_date date, end_date date);
Create table If Not Exists Streams (session_id int, account_id int, stream_date date);
Truncate table Subscriptions;
insert into Subscriptions (account_id, start_date, end_date) values ('9', '2020-02-18', '2021-10-30');
insert into Subscriptions (account_id, start_date, end_date) values ('3', '2021-09-21', '2021-11-13');
insert into Subscriptions (account_id, start_date, end_date) values ('11', '2020-02-28', '2020-08-18');
insert into Subscriptions (account_id, start_date, end_date) values ('13', '2021-04-20', '2021-09-22');
insert into Subscriptions (account_id, start_date, end_date) values ('4', '2020-10-26', '2021-05-08');
insert into Subscriptions (account_id, start_date, end_date) values ('5', '2020-09-11', '2021-01-17');
Truncate table Streams;
insert into Streams (session_id, account_id, stream_date) values ('14', '9', '2020-05-16');
insert into Streams (session_id, account_id, stream_date) values ('16', '3', '2021-10-27');
insert into Streams (session_id, account_id, stream_date) values ('18', '11', '2020-04-29');
insert into Streams (session_id, account_id, stream_date) values ('17', '13', '2021-08-08');
insert into Streams (session_id, account_id, stream_date) values ('19', '4', '2020-12-31');
insert into Streams (session_id, account_id, stream_date) values ('13', '5', '2021-01-05');

四、题目分析

需求:

        在 2021 购买订阅但没有任何会话的帐户数

解题:

        1、在2021订阅中

                购买订阅的日期是一个时间段,中间有可能跨年,先提取开始和结束的年,用递归列出所有的年份,筛选出2021年的账户

        2、在2021没有任何会话

               子查询not in查询会话表中在2021的用户就是在2021年没有会话的用户

        3、最后通过筛选出来的数据统计即可

五、SQL解答

六、最终答案

with recursive t1 as (
    select account_id,year(start_date)as `year` from Subscriptions
    union all
    select t1.account_id,year + 1
    from t1
    join Subscriptions s1
        on t1.account_id = s1.account_id
        and t1.year < year(s1.end_date)
)
select
    count(distinct account_id) as accounts_count
from t1
-- 在2021年订阅表中
where t1.year = 2021
            -- 不再在2021年消费表中
 and account_id not in (select account_id from Streams where year(stream_date) = 2021)

七、验证

标签:account,Subscriptions,力扣,2020,2021,SQL,date,id
From: https://blog.csdn.net/qq_30900519/article/details/143566147

相关文章

  • SQL Server 2022 RTM Cumulative Update 15 发布下载 (累积更新包)
    SQLServer2022RTMCumulativeUpdate15发布下载(累积更新包)最新的累积更新(CU)下载,包含自SQLServer2022RTM发布以来的所有更新。请访问原文链接:https://sysin.org/blog/sql-server-2022/查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgSQLServer202......
  • 【C语言】实战-力扣题库:回文链表
    题目描述给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?问题分析O(1)的时间复杂度---跟n......
  • 服务器上mysqld,java的进程Out of Memory,被kernel kill 掉了
    /var/log/messages里面日志如下Aug1019:47:16VM-0-7-centoskernel:8936totalpagecachepagesAug1019:47:16VM-0-7-centoskernel:0pagesinswapcacheAug1019:47:16VM-0-7-centoskernel:Swapcachestats:add0,delete0,find0/0Aug1019:47:16VM-0......
  • 【力扣打卡系列】单调栈
    坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day20单调栈题目描述解题思路单调栈后进先出记录的数据加在最上面丢掉数据也先从最上面开始单调性记录t[i]之前会先把所有小于等于t[i]的数据丢掉,不可能出现上面大下面小的情况倒着遍历,while遍历,......
  • 系统变量group_replication_group_seeds为空导致MySQL节点无法启动组复制
    MySQLInnoDBCluster集群中一个节点,在服务器重启过后,启动MySQL实例后,发现status为MISSING,另外memberState为OFFLINE状态。如下所示: MySQL  mysqldbu02:7306 ssl  JS > cluster.status(){    "clusterName": "yssps",     "defaultReplicaSet": {      ......
  • 【leetcode】40-best-time-to-buy-and-sell-stock 力扣 121. 买卖股票的最佳时机
    买卖股票系列【leetcode】40-best-time-to-buy-and-sell-stock力扣121.买卖股票的最佳时机【leetcode】41-best-time-to-buy-and-sell-stock-ii力扣122.买卖股票的最佳时机II【leetcode】42-best-time-to-buy-and-sell-stock-iii力扣123.买卖股票的最佳时机III【le......
  • dvwa-sql注入中级
    因为页面上只能选择相应数字查询,因此需要抓包进行注入;首先通过语句判断是字符型还是数字型:id=1and1=1--+id=1and1=2--+如图,两次返回结果不同,因此这是一个数字型注入。然后依照流程爆出当前表列数和回显位,爆出当前数据库名字(这一步就省略了);接着,要利用information_sch......
  • python: more Layer Architecture and its Implementation in Python and sql server
    sqlserver:createtableSchool--創建表(SchoolIdchar(5)NOTNULLPRIMARYKEY,SchoolNamenvarchar(500)NOTNULLDEFAULT'',SchoolTelNovarchar(8)NULLDEFAULT'',);gomodel:#encoding:utf-8#版权所有......
  • Ubuntu Linux中安装MySQL教程
    在UbuntuLinux中安装MySQL步骤步骤一:更新软件包列表首先,更新你的软件包列表:sudoaptupdate步骤二:安装MySQL服务器使用以下命令安装MySQL服务器:sudoaptinstallmysql-server步骤三:启动MySQL服务安装完成后,启动MySQL服务:sudosystemctlstartmysql......
  • mysql 事务隔离级别
    在数据库中两个事务并发执行的时候会产生以下问题:脏读:当有事务修改了一条记录但未提交,另一事务读取该记录前后结果不一致不可重复读:当有事务修改了一条记录并且已经提交,另一事务前后读取该记录前后结果不一致幻读:当有事务新增了记录并且已经提交,另一事务中前后查出记录数不一......