【MySQL】MySQL版本8+ 窗口函数 Lead 的两种使用

这篇具有很好参考价值的文章主要介绍了【MySQL】MySQL版本8+ 窗口函数 Lead 的两种使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

力扣题

1、题目地址

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

2、模拟表

表:UserVisits

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

3、要求

  • 假设今天的日期是 ‘2021-1-1’ 。
  • 编写解决方案,对于每个 user_id ,求出每次访问及其下一个访问(若该次访问是最后一次,则为今天)之间最大的空档期天数 window
  • 返回结果表,按用户编号 user_id 排序。

4、示例

输入:

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 天。

5、代码编写

Lead (列名) 语法

SELECT user_id, MAX(biggest_window) AS biggest_window
FROM (
    SELECT *, DATEDIFF(
    	IFNULL(
    		Lead(visit_date) over (partition by user_id order by visit_date), 
    		'2021-1-1'
    	), visit_date
    ) AS biggest_window
    FROM UserVisits
) AS one
GROUP BY user_id

如果加 IFNULL

SELECT *, DATEDIFF(
	IFNULL(
		Lead(visit_date) over (partition by user_id order by visit_date), 
		'2021-1-1'
	), visit_date
) AS biggest_window
FROM UserVisits
| user_id | visit_date | biggest_window |
| ------- | ---------- | -------------- |
| 1       | 2020-10-20 | 39             |
| 1       | 2020-11-28 | 5              |
| 1       | 2020-12-03 | 29             |
| 2       | 2020-10-05 | 65             |
| 2       | 2020-12-09 | 23             |
| 3       | 2020-11-11 | 51             |

如果不加 IFNULL,还需要特别处理

SELECT *, DATEDIFF(
    Lead(visit_date) over (partition by user_id order by visit_date),  
    visit_date
) AS biggest_window
FROM UserVisits
| user_id | visit_date | biggest_window |
| ------- | ---------- | -------------- |
| 1       | 2020-10-20 | 39             |
| 1       | 2020-11-28 | 5              |
| 1       | 2020-12-03 | null           |
| 2       | 2020-10-05 | 65             |
| 2       | 2020-12-09 | null           |
| 3       | 2020-11-11 | null           |

Lead (列名, 偏移量, 超出记录窗口时的默认值) 语法

SELECT user_id, MAX(biggest_window) AS biggest_window
FROM (
    SELECT *, DATEDIFF(
    	Lead(visit_date, 1, '2021-01-01') over (partition by user_id order by visit_date), 
    	visit_date
    ) AS biggest_window
    FROM UserVisits
) AS one
GROUP BY user_id

以前文章

【MySQL】窗口函数 Lead 和 Lag 的运用(MySQL版本8+)以及 时间差函数 TIMESTAMPDIFF 的运用文章来源地址https://www.toymoban.com/news/detail-815093.html

到了这里,关于【MySQL】MySQL版本8+ 窗口函数 Lead 的两种使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL中的两种特殊插入方式

    代码案例 PointMapper.java PointMapper.xml 代码案例 PointMapper.java PointMapper.xml on duplicate key update 和 replace into 是两种处理重复键冲突的方法,但它们具有一些区别 功能不同 on duplicate key update 在插入数据时,如果遇到重复键冲突,会更新已存在的行的值 replace into在插入数据时,如果遇

    2024年02月12日
    浏览(48)
  • 【MYSQL】binlog安全清理的两种方法

    通常在交付MYSQL数据库前会将日志目录与数据文件分开,为其单独设立一个文件系统,这样便于掌握日志与数据的空间使用情况。如果不是业务突然增长,binlog会按照默认设置的过期时间自动被清理,但是有时候业务量增长是很突然的,比如上线了一个活动等,所以设置binl

    2023年04月16日
    浏览(29)
  • 修改mysql默认字符集的两种方法

    下面微点阅读小编就为大家介绍两种修改mysql默认字符集的方法。需要的朋友可以过来参考下 (1) 最简单的修改方法,就是修改mysql的my.ini文件中的字符集键值 , 如 default-character-set = utf8    character_set_server = utf8 修改完后,重启mysql的服务,service mysql restart 使用 mysql SHOW VARI

    2024年02月06日
    浏览(46)
  • 常用的两种 MySQL 查询时间段的方法

    在 MySQL 数据库中,经常需要查询某个时间段内的数据。本文将介绍两种常用的 MySQL 查询时间段的方法,并提供相应的源代码示例。 方法一:使用 BETWEEN 运算符 BETWEEN 运算符可用于查询一个范围内的值,包括指定的起始值和结束值。在查询时间段时,我们可以将起始时间作为

    2024年02月05日
    浏览(35)
  • Mysql为json字段创建索引的两种方式

    JSON 数据类型是在 mysql5.7 版本后新增的,同 TEXT,BLOB 字段一样,JSON 字段不允许直接创建索引。即使支持,实际意义也不大,因为我们一般是基于文档中的元素进行查询,很少会基于整个 JSON 文档。基于此问题,在 MySQL 8.0.17 及以后的版本中,InnoDB存储引擎支持JSON数组上的

    2024年02月12日
    浏览(33)
  • Mysql树形表的两种查询方案(递归与自连接)

    你有没有遇到过这样一种情况: 一张表就实现了一对多的关系,并且表中每一行数据都存在“爷爷-父亲-儿子-…”的联系,这也就是所谓的树形结构 对于这样的表很显然想要通过查询来实现价值绝对是不能只靠select * from table 来实现的,下面提供两种解决方案: inner join 关键

    2024年01月16日
    浏览(37)
  • mysql中desc的两种用法---1、查询表结构和降序

    1、查询表结构 语法: desc table_name; PS:此处desc是describe的缩写,用法: desc 表名/查询语句 2、降序 语法: select * from 表 order by 字段 desc select ename,sal from emp order by sal desc; 手动指定按照薪水由大到小排序(降序desc) select ename,sal from emp order by sal asc; 手动指定按照薪水

    2024年02月13日
    浏览(39)
  • Vue3使用全局函数或变量的两种常用方式

    例如:想要在index.ts中创建getAction函数,并可以全局使用: 方式一:使用依赖注入(provide/inject) 在main.ts中进行挂载: 在要使用的页面注入: 方式二:使用 app.config.globalProperties 和 getCurrentInstance() app.config.globalProperties:一个用于注册能够被应用内所有组件实例访问到的全局

    2024年02月12日
    浏览(29)
  • MYSQL窗口函数(Rows & Range)——滑动窗口函数用法

    窗口函数语法: 窗口函数 over (partition by 用于分组的列名 order by 用于排序的列名 rows/range子句用于定义窗口大小 ) 窗口函数可以放以下两种函数: 1) 专用窗口函数,包括后面要讲到的rank, dense_rank, row_number等专用窗口函数。 2) 聚合函数,如sum. avg, count, max, min等 1)专用窗口

    2024年02月10日
    浏览(30)
  • MySQL窗口函数(MySQL Window Functions)

           MySQL从8.0开始支持窗口函数(Window Functions),因其经常被用在数据分析的场景,窗口函数也被称为分析函数(Analytic Functions)。 目录 一、窗口函数概念 二、基础语法 2.1 窗口的定义 2.2 命名窗口 三、专用窗口函数 3.1 row_number() 3.2 rank() 3.3 dense_rank() 3.4 percent_rank() 3.5

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包