首页 > 数据库 >SQL实战训练之,力扣:1709. 访问日期之间最大的空档期

SQL实战训练之,力扣:1709. 访问日期之间最大的空档期

时间:2024-10-23 17:19:56浏览次数:9  
标签:1709 visit 力扣 2020 user SQL date id select

目录

        一、力扣原题链接

        二、题目描述

        三、建表语句

        四、题目分析        

        五、SQL解答

        六、最终答案

        七、验证

        八、知识点


一、力扣原题链接

1709. 访问日期之间最大的空档期

二、题目描述

用户访问量表: UserVisits

+-------------+------+
| Column Name | Type |
+-------------+------+
| user_id     | int  |
| visit_date  | date |
+-------------+------+
该表没有主键,它可能有重复的行
该表包含用户访问某特定零售商的日期日志。

假设今天的日期是 '2021-1-1' 。

编写解决方案,对于每个 user_id ,求出每次访问及其下一个访问(若该次访问是最后一次,则为今天)之间最大的空档期天数 window 。

返回结果表,按用户编号 user_id 排序。

结果格式如下示例所示:

示例 1:

输入:
UserVisits 用户访问量表:
+---------+------------+
| user_id | visit_date |
+---------+------------+
| 1       | 2020-11-28 |
| 1       | 2020-10-20 |
| 1       | 2020-12-3  |
| 2       | 2020-10-5  |
| 2       | 2020-12-9  |
| 3       | 2020-11-11 |
+---------+------------+
输出:
+---------+---------------+
| user_id | biggest_window|
+---------+---------------+
| 1       | 39            |
| 2       | 65            |
| 3       | 51            |
+---------+---------------+
解释:
对于第一个用户,问题中的空档期在以下日期之间:
    - 2020-10-20 至 2020-11-28 ,共计 39 天。
    - 2020-11-28 至 2020-12-3 ,共计 5 天。
    - 2020-12-3 至 2021-1-1 ,共计 29 天。
由此得出,最大的空档期为 39 天。
对于第二个用户,问题中的空档期在以下日期之间:
    - 2020-10-5 至 2020-12-9 ,共计 65 天。
    - 2020-12-9 至 2021-1-1 ,共计 23 天。
由此得出,最大的空档期为 65 天。
对于第三个用户,问题中的唯一空档期在 2020-11-11 至 2021-1-1 之间,共计 51 天。

三、建表语句

drop table if exists UserVisits;
Create table If Not Exists UserVisits(user_id int, visit_date date);
Truncate table UserVisits;
insert into UserVisits (user_id, visit_date) values ('1', '2020-11-28');
insert into UserVisits (user_id, visit_date) values ('1', '2020-10-20');
insert into UserVisits (user_id, visit_date) values ('1', '2020-12-3');
insert into UserVisits (user_id, visit_date) values ('2', '2020-10-5');
insert into UserVisits (user_id, visit_date) values ('2', '2020-12-9');
insert into UserVisits (user_id, visit_date) values ('3', '2020-11-11');

四、题目分析

第一步:排名(根据用户id分组,访问日期倒序排序)

第二步:条件判断(排名1的结束日期为2021-01-01,其他则为上一个访问日期)

第三步:计算日期差(结束日期 - 访问日期)空档期

第四步:根据用户id分组找最大值

五、SQL解答

-- 1、排名
select
    distinct
    *,
    dense_rank() over (partition by user_id order by visit_date desc) as dr
from uservisits
;

-- 2、根据排名的条件获得结束日期
with t1 as (
    select
        distinct
        *,
        dense_rank() over (partition by user_id order by visit_date desc) as dr
    from uservisits
)
select
    user_id,
    visit_date,
    case
        when dr = 1 then '2021-01-01'
        else lag(visit_date) over (partition by user_id order by visit_date desc)
    end as end_date
from t1
;

-- 3、结束日期 - 开始日期 等于 日期差
with t1 as (
    select
        distinct
        *,
        dense_rank() over (partition by user_id order by visit_date desc) as dr
    from uservisits
),t2 as (
    select
        user_id,
        visit_date,
        case
            when dr = 1 then '2021-01-01'
            else lag(visit_date) over (partition by user_id order by visit_date desc)
        end as end_date
    from t1
)
select
    user_id,visit_date,end_date,
    datediff(end_date,visit_date) as diff
from t2
;

-- 4、根据用户ID分组,取最大的差值
with t1 as (
    select
        distinct
        *,
        dense_rank() over (partition by user_id order by visit_date desc) as dr
    from uservisits
),t2 as (
    select
        user_id,
        visit_date,
        case
            when dr = 1 then '2021-01-01'
            else lag(visit_date) over (partition by user_id order by visit_date desc)
        end as end_date
    from t1
),t3 as (
select
    user_id,visit_date,end_date,
    datediff(end_date,visit_date) as diff
from t2
)
select
    user_id,
    max(diff) as biggest_window
from t3
group by user_id
order by user_id
;

六、最终答案

with t1 as (
    select
        distinct
        *,
        -- 1、排名
        dense_rank() over (partition by user_id order by visit_date desc) as dr
    from uservisits
),t2 as (
    select
        user_id,
        visit_date,
        -- 2、条件判断得出结束日期
        case
            when dr = 1 then '2021-01-01'
            -- 上一行的值
            else lag(visit_date) over (partition by user_id order by visit_date desc)
        end as end_date
    from t1
),t3 as (
select
    user_id,visit_date,end_date,
    -- 3、计算日期差(空窗期)
    datediff(end_date,visit_date) as diff
from t2
)
select
    user_id,
    -- 4、分组求最大
    max(diff) as biggest_window
from t3
group by user_id
order by user_id
;

七、验证

八、知识点

  • distinct 去重
  • dense_rank 排名
  • case..when 条件判断
  • lag 上一行的值
  • max 最大值

标签:1709,visit,力扣,2020,user,SQL,date,id,select
From: https://blog.csdn.net/qq_30900519/article/details/143179174

相关文章

  • mysql中将一行数据根据条件分拆多行
    以下用法只支持mysql8.0以上;遇到了个数据结构,字符串用逗号隔开的,需要分拆后统计数据,用到了mysql8的一个JSON_TABLE用法CREATETABLEitems(idINTAUTO_INCREMENTPRIMARYKEY,nameVARCHAR(255),tagsVARCHAR(255));INSERTINTOitems(name,tags)VALUES......
  • 两个时间段比较的六种情况,以及交集、并集、补集简要sql语句示例
    〇、两时间段比较的全部情况总共有如下图中的六种情况:下文将根据这六种情况进一步操作。注意,图中说的动态和固定两时间段,就是两个普通时间段,不区分主次,仅用作帮助理解。一、判断两个时间段是否有交叉(交集)正常情况下,就是图中的2、3、4、5四种有交叉的情况。如果直接通过这......
  • kubesphere搭建nacos2.2.3(MySQL)
    环境准备创建nacos数据库,sql来自于nacos官网,自行查找并执行启动环境配置如图具体配置如下具体含义请参考nacos官网#***************SpringBootRelatedConfigurations***************####Defaultwebcontextpath:server.servlet.contextPath=/nacos###Inc......
  • PbootCMS执行SQL发生错误!错误:no such column: def1
    当您在升级PbootCMSv3.0.6版本时遇到“执行SQL发生错误!错误:nosuchcolumn:def1”或“执行SQL发生错误!错误:duplicatecolumnname:picstitle”的提示,通常是因为数据库字段没有正确添加或已经存在。以下是一些解决方法:解决步骤备份数据库:在进行任何数据库操作之前,务必先备......
  • sql驱动
    #服务的端口server.port=7123spring.jpa.hibernate.ddl-auto=update#################redis配置start################spring.redis.host=127.0.0.1spring.redis.port=6379spring.redis.password=123456spring.redis.database=0#################redis配置end####......
  • 在SQL Server中,可以使用查询结果生成SQL语句,通常通过动态SQL来实现。以下是一些常见的
    ai查到的,用着可以的,记录下示例场景假设有一个名为Employees的表,包含EmployeeID、FirstName和LastName字段。我们想要根据查询结果生成一系列的INSERT语句。1.使用FORXMLPATH生成INSERT语句SELECT'INSERTINTOEmployees(EmployeeID,FirstName,LastName)VALUES(......
  • 高效集成:旺店通旗舰版与MySQL的数据对接方案
    旺店通旗舰版-其他入库单-->BI泰海-其他入库单表_原始查询(2024年起)数据集成方案在现代企业的数据管理中,如何高效、可靠地实现系统间的数据对接是一个关键挑战。本文将分享一个具体的技术案例,展示如何通过轻易云数据集成平台,将旺店通·旗舰奇门的数据无缝集成到MySQL数据库中。......
  • 腾讯云的TDSQL-H LibraDB,底层是Clickhouse
    一.java版本引用方式通过jdbc可参考腾讯文档https://cloud.tencent.com/document/product/1488/79810<dependency><groupId>ru.yandex.clickhouse</groupId><artifactId>clickhouse-jdbc</artifactId><version>0.3.2</version><......
  • MySQL 回收表碎片实践教程
    前言:在MySQL数据库中,随着数据的增删改操作,表空间可能会出现碎片化,这不仅会占用额外的存储空间,还可能降低表的扫描效率,特别是一些大表,在进行数据清理后会产生大量的碎片。本篇文章我们一起来学习下如何进行碎片回收以及相关注意点。查看表碎片大小一般MySQL数据库都是开启i......
  • docker安装mysql
    本次分享docker安装mysql,没有废话,绝对全网最简单首先你需要已经安装过docker,在这里默认已安装过docker。安装mysql命令:dockerrun--namemysql-p3306:3306-eMYSQL_ROOT_PASSWORD=123456-dmysql:5.7--lower_case_table_names=1其中密码和mysql版本可自己改然后......