单挑力扣(LeetCode)SQL题:1709. 访问日期之间最大的空档期(难度:中等)

news/2025/1/17 8:00:05/

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

(通过次数3,983 | 提交次数5,518,通过率72.18%)

表:UserVisits
+-------------+------+
| Column Name | Type |
+-------------+------+
| user_id     | int  |
| visit_date  | date |
+-------------+------+
该表没有主键。
该表包含用户访问某特定零售商的日期日志。假设今天的日期是'2021-1-1'。
编写 SQL 语句,对于每个user_id,求出每次访问及其下一个访问(若该次访问是最后一次,则为今天)之间最大的空档期天数window。
返回结果表,按用户编号user_id排序。查询格式如下示例所示:
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 天。来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/biggest-window-between-visits

#测试数据
Create table If Not Exists UserVisits(user_id int, visit_date date);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');

解题思路:

本题要求计算出一串日期中,间隔时间最大的天数。

那么,我们的思路可能是:

1、取出每一个日期的上一个日期或者下一个日期;

2、两个日期相减得出天数;

3、再取个最大值就可以了。

后两步都简单,难点在于第一步。

对于一个日期,它的下一个日期,必定是比它大的所有日期里的最小日期;

同样的,它的上一个日期,必定是比它小的所有日期里的最大日期;

比如,可以使用如下SQL取出每一个日期的下一个日期。

selecta.user_id,a.visit_date,min(coalesce(b.visit_date,'2021-01-01')) next_visit_date
from UserVisits a
left join UserVisits b
on a.user_id = b.user_id
and a.visit_date < b.visit_date
group by a.user_id,a.visit_date;

不过,强哥今天介绍另一种方法,使用分析函数:lead。

分析函数lead的作用是返回统计窗口内向下的第n个值。如果第n个值不存在,还支持设置默认值。

使用语法为:lead(column_name,n,default_value)。

column_name:要取值的字段;

n:向下取的值的序号;

default_value:默认取值;

那么,对于取每个日期的下一个日期,可以使用如下SQL:

SELECTa.user_id,a.visit_date,lead(a.visit_date, 1, '2021-01-01') over (partition by a.user_id order by a.visit_date) as lead_visit_date
FROM UserVisits a;

参考SQL:


SELECTb.user_id,max(datediff(b.lead_visit_date, b.visit_date)) as biggest_window
FROM (SELECTa.user_id,a.visit_date,lead(a.visit_date, 1, '2021-01-01') over (partition by a.user_id order by a.visit_date) as lead_visit_dateFROM UserVisits a
) b
GROUP BY b.user_id
ORDER BY b.user_id;


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

相关文章

天擎终端安全管理系统clientinfobymid存在SQL注入漏洞

产品简介 奇安信天擎终端安全管理系统是面向政企单位推出的一体化终端安全产品解决方案。该产品集防病毒、终端安全管控、终端准入、终端审计、外设管控、EDR等功能于一体&#xff0c;兼容不同操作系统和计算平台&#xff0c;帮助客户实现平台一体化、功能一体化、数据一体化的…

三个故事,谈谈小米汽车技术发布会

都说新年新气象&#xff0c;随着年末消费旺季到来&#xff0c;汽车市场越来越热闹了。 继蔚来12月23日公布旗舰车型ET9&#xff0c;华为26日发布问界M9&#xff0c;小米汽车首款量产车型SU7终于正式亮相。 12月28日&#xff0c;在小米汽车技术发布会上&#xff0c;小米创办人…

JUnit 简介

JUnit 是什么&#xff1f; JUnit是一个Java测试框架&#xff0c;主要用于单元测试、集成测试&#xff0c;也可以用于创建自动测试。 JUnit框架是最流行的Java测试框架之一。它提供了一些功能&#xff0c;使编写测试变得容易&#xff0c;包括支持多个测试用例、断言和报告。JUn…

数据结构之树 --- 二叉树

目录 定义二叉树的结构体 二叉树的遍历 递归遍历 非递归遍历 链式二叉树的实现 二叉树的功能接口 先序遍历创建二叉树 后序遍历销毁二叉树 先序遍历查找树中值为x的节点 层序遍历 上篇我们对二叉树的顺序存储堆进行了讲述&#xff0c;本文我们来看链式二叉树。 定…

Halcon颜色通道的处理decompose3/image_to_channels/channels _to _image

Halcon颜色通道的处理 文章目录 Halcon颜色通道的处理一. 图像的通道二. 访问通道1.访问通道2.获取通道的数量 三. 通道分离与合并1. decompose3算子2. image_to_channels 算子3. compose3算子4. channels_to_image算子 四. 处理RGB信息 由于彩色图像通常包含不止一个通道&…

JAVA B/S架构智慧工地源码,PC后台管理端、APP移动端

智慧工地系统充分利用计算机技术、互联网、物联网、云计算、大数据等新一代信息技术&#xff0c;以PC端&#xff0c;移动端&#xff0c;设备端三位一体的管控方式为企业现场工程管理提供了先进的技术手段。让劳务、设备、物料、安全、环境、能源、资料、计划、质量、视频监控等…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】ShuffleNet_V2模型算法详解前言ShuffleNet_V2讲解四条实用指导思想G1:相等的通道宽度可以降低存储访问成本G2:大量的分组卷积…

机器学习距离度量方法

1. 机器学习中为什么要度量距离&#xff1f; 机器学习算法中&#xff0c;经常需要 判断两个样本之间是否相似 &#xff0c;比如KNN&#xff0c;K-means&#xff0c;推荐算法中的协同过滤等等&#xff0c;常用的套路是 将相似的判断转换成距离的计算 &#xff0c;距离近的样本相…