【MySQL】ROW_NUMBER 窗口函数妙用之报告系统状态的连续日期

力扣题

1、题目地址

1225. 报告系统状态的连续日期

2、模拟表

表:Failed

Column NameType
fail_datedate
  • 该表主键为 fail_date (具有唯一值的列)。
  • 该表包含失败任务的天数.

表: Succeeded

Column NameType
success_datedate
  • 该表主键为 success_date (具有唯一值的列)。
  • 该表包含成功任务的天数.

3、要求

系统 每天 运行一个任务。每个任务都独立于先前的任务。任务的状态可以是失败或是成功。

编写解决方案找出 2019-01-01 到 2019-12-31 期间任务连续同状态 period_state 的起止日期(start_date 和 end_date)。

即如果任务失败了,就是失败状态的起止日期,如果任务成功了,就是成功状态的起止日期。

最后结果按照起始日期 start_date 排序。

4、示例

输入:
Failed 表:

fail_date
2018-12-28
2018-12-29
2019-01-04
2019-01-05

Succeeded 表:

success_date
2018-12-30
2018-12-31
2019-01-01
2019-01-02
2019-01-03
2019-01-06

输出:

period_statestart_dateend_date
succeeded2019-01-012019-01-03
failed2019-01-042019-01-05
succeeded2019-01-062019-01-06

解释:
结果忽略了 2018 年的记录,因为我们只关心从 2019-01-01 到 2019-12-31 的记录
从 2019-01-01 到 2019-01-03 所有任务成功,系统状态为 “succeeded”。
从 2019-01-04 到 2019-01-05 所有任务失败,系统状态为 “failed”。
从 2019-01-06 到 2019-01-06 所有任务成功,系统状态为 “succeeded”。

5、代码编写

网友写法

SELECT state AS period_state, MIN(date) AS start_date, MAX(date) AS end_date
FROM (SELECT *,row_number() over (partition by state order by date asc) AS rk1,row_number() over (order by date asc) AS rk2FROM (SELECT fail_date AS 'date', 'failed' AS state FROM failedUNION ALLSELECT success_date, 'succeeded' FROM succeeded) t
) t2
WHERE date BETWEEN '2019-01-01' AND '2019-12-31'
GROUP BY state, rk2-rk1

代码分析

第一步,将两个表数据查询出来并标上状态,方便后面用窗口函数处理

SELECT fail_date AS 'date', 'failed' AS state FROM failed
UNION ALL
SELECT success_date, 'succeeded' FROM succeeded
datestate
2018-12-28failed
2018-12-29failed
2019-01-04failed
2019-01-05failed
2018-12-30succeeded
2018-12-31succeeded
2019-01-01succeeded
2019-01-02succeeded
2019-01-03succeeded
2019-01-06succeeded

第二步,第一个 row_number 根据状态的不同,分组后按日期正序进行排序处理,第二个 row_number 很明显是按日期正序,后面使用

SELECT *,row_number() over (partition by state order by date asc) AS rk1,row_number() over (order by date asc) AS rk2
FROM (SELECT fail_date AS 'date', 'failed' AS state FROM failedUNION ALLSELECT success_date, 'succeeded' FROM succeeded
) t
datestaterk1rk2
2018-12-28failed11
2018-12-29failed22
2018-12-30succeeded13
2018-12-31succeeded24
2019-01-01succeeded35
2019-01-02succeeded46
2019-01-03succeeded57
2019-01-04failed38
2019-01-05failed49
2019-01-06succeeded610

第三步,首先根据状态分组能做状态区分,第二点是关键,rk2-rk1,因为rk2是连续的,所以很清楚就能知道 rk2-rk1 如果是相等的那必定是连续的,但是可能会碰到 state 不同,rk2-rk1 相同的情况(前面先 group by state 就是首先排除这种情况)

SELECT state AS period_state, MIN(date) AS start_date, MAX(date) AS end_date
FROM (SELECT *,row_number() over (partition by state order by date asc) AS rk1,row_number() over (order by date asc) AS rk2FROM (SELECT fail_date AS 'date', 'failed' AS state FROM failedUNION ALLSELECT success_date, 'succeeded' FROM succeeded) t
) t2
WHERE date BETWEEN '2019-01-01' AND '2019-12-31'
GROUP BY state, rk2-rk1
period_statestart_dateend_date
succeeded2019-01-012019-01-03
failed2019-01-042019-01-05
succeeded2019-01-062019-01-06

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/738630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Elastic Stack--08--SpringData框架

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 SpringData[官网: https://spring.io/projects/spring-data](https://spring.io/projects/spring-data) Spring Data Elasticsearch 介绍 1.SpringData-…

AI+X 高校行:首场浙大站爆满!

Datawhale线下 线下活动:AIX 高校行活动 AIX:希望将人工智能(AI)与各个学科和行业(X)结合, 激发无限潜力和创造力(X),让年轻人拥有更多可能性(X&…

Discord OAuth2授权以及机器人监听群事件

下面文章讲解获取OAuth2授权整个流程,创建机器人,使用机器人监听工会(工会就是创建的服务器)成员变化等等,对接国外的都是需要VPN的哦,对接的时候记得提前准备。 创建应用 点击 此页面添加应用,&#xff…

Midjourney绘图欣赏系列(七)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

[C++] C++生成随机数

一、简介 在C语言中常使用srand()random()的方式生成随机数,该方式并不是一个很好的随据说生成方法,一方面是因为其生成的随机数质量较低,另一方面其随机数范围也有所限制。在C11中推荐使用随机数引擎的方式生成随机数。 如何高效得生成高质…

JavaWeb - Expected URL scheme ‘http‘ or ‘https‘ but no colon was found

问题描述 Expected URL scheme http or https but no colon was found 原因分析 一般是代码中 HttpClient 或其他远程请求中 URL 为 null 引起的 解决方案 检查调试代码请求中的 URL 是否为空,根据业务解决即可~

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新)

【wps】wps与office办公函数储备使用(结合了使用案例 持续更新) 1、TODAY函数 返回当前电脑系统显示的日期 TODAY函数:表示返回当前电脑系统显示的日期。 公式用法:TODAY() 2、NOW函数 返回当前电脑系统显示的日期和时间 NOW函数:表示返…

安装CDH平台的服务器磁盘满了,磁盘清理过程记录

1.使用hdfs命令查看哪个文件占用最大 hdfs dfs -du -h /tmp 2.我的服务器上显示/tmp/hive/hive文件夹下的,一串字符串命名的文件特别大几乎把磁盘占满了 网上查到/tmp文件是临时文件,由于hiveserver2任务运行异常导致缓存未删除,正常情况下…

蚂蚁链摩斯荣获“艾瑞保险业数字化卓越服务商“奖

近日,艾瑞咨询发布《2023年中国保险业数字化转型研究报告》,摩斯隐私计算解决方案被报告入选,并获得“保险业数字化卓越服务商”奖。 蚂蚁摩斯是隐私计算行业的领先布局者:早在2017年,蚂蚁集团启动了隐私计算项目&…

Linux操作系统-07-Linux安装应用

一、使用rpm安装应用(不推荐) 先下载到本地,以.rpm文件名结尾,下载完成后,再安装 rpm -qa | grep mysql #查询当前系统是否有下载过mysql包 先上传mysql的rpm安装包到linux的opt目录 安装 rpm -ivh …

Linux 多进程开发(上)

第二章 Linux 多进程开发 2.1 进程概述2.2 进程状态转换2.3 进程创建2.4 exec 函数族2.5 进程控制 网络编程系列文章: 第1章 Linux系统编程入门(上) 第1章 Linux系统编程入门(下) 第2章 Linux多进程开发(…

Opencv 插值方法 总结

一、概括 面试的时候问到了一个图,就是如何将一个算子放缩??我第一反应是resize(),但是后来我转念一想,人家问的是插值方式,今天来总结一下 最邻近插值法原理分析及c实现_最临近插值法-CSDN博…

836. 合并集合(acwing)

文章目录 836. 合并集合题目描述并查集acwing并查集模板 836. 合并集合 题目描述 一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。 现在要进行 m 个操作,操作共有两种: M a b,将编号为 a 和 b 的两个数…

Python与C++的对比——跟老吕学Python编程

Python与C的对比——跟老吕学Python编程 Python与C的对比1.C编译型 vs Python解释型2.执行效率3.开发效率4.跨平台5.可移植性6.内存管理机制7.易学性8.静态类型 vs 动态类型9.面向对象编程概念10.垃圾回收11.应用领域 Python与C的对比表 Python与C的对比 Python和C都是最受欢迎…

数据结构小记【Python/C++版】——散列表篇

一,基础概念 散列表,英文名是hash table,又叫哈希表。 散列表通常使用顺序表来存储集合元素,集合元素以一种很分散的分布方式存储在顺序表中。 散列表是一个键值对(key-item)的组合,由键(key)和元素值(item)组成。键…

解密阿里巴巴面试题:如何设计一个微博?

亲爱的小米科技粉丝们,大家好呀!今天小米带来了一则热门话题——阿里巴巴面试题:如何设计一个微博?别着急,跟着小米一起来揭秘吧! 实现哪些功能? 在设计微博系统时,需要考虑实现哪些功能才能满足用户的需求。除了基本的发布推文、时间线、新闻推送、关注/不允许用户以…

编程训练基础代码六

1、定义一个方法,该方法能够找出两个小数中的较小值并返回。 public class SmallerValue {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入两个整数: ");int asc.nextInt();int bsc.nextInt();…

算法 -【找出字符串的可整除数组】

找出字符串的可整除数组 题目示例1示例2 分析代码 题目 给你一个下标从 0 开始的字符串 word ,长度为 n ,由从 0 到 9 的数字组成。另给你一个正整数 m 。word 的可整除数组 div 是一个长度为 n 的整数数组,并满足: 如果 word[0…

【JavaScript 漫游】【034】AJAX

文章简介 本篇文章为【JavaScript 漫游】专栏的第 034 篇文章,对浏览器模型的 XMLHttpRequest 对象(AJAX)的知识点进行了总结。 XMLHttpRequest 对象概述 浏览器与服务器之间,采用 HTTP 协议通信。用户在浏览器地址栏键入一个网…

Java项目源码基于springboot的家政服务平台的设计与实现

大家好我是程序员阿存,在java圈的辛苦码农。辛辛苦苦板砖,今天要和大家聊的是一款Java项目源码基于springboot的家政服务平台的设计与实现,项目源码以及部署相关请联系存哥,文末附上联系信息 。 项目源码:Java基于spr…