SQL进阶技巧:如何找出开会时间有重叠的会议室?| 时间区间重叠问题

目录

0 场景描述

1 数据准备

2 问题分析

方法1:利用 lateral view posexplode()函数将表展开成时间明细表

方法2:利用数学区间讨论思想求解

3 小结

如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:

数字化建设通关指南

专栏 原价99,现在活动价59.9,按照阶梯式增长,直到恢复原价。


0 场景描述

有7个会议室,每个会议室每天都有人开会,某一天的开会时间如下:

查询出开会时间有重叠的是哪几个会议室?上面预期结果是 ID 2 3 4 5 6 

1 数据准备

create table  meeting as(
select 1 id,'08:00' starttime,'09:15' endtime
union all
select 2,'13:20','15:20'
union all
select 3,'10:00','14:00'
union all
select 4,'13:55','16:25'
union all
select 5,'14:00','17:45'
union all
select 6,'14:05','17:45'
union all
select 7,'18:05','19:45')

 

2 问题分析

方法1:利用 lateral view posexplode()函数将表展开成时间明细表

具体SQL如下:

select id
     , starttime + pos  as hour
from (select id
           , substr(starttime, 1, 2)                         starttime
           , substr(endtime, 1, 2)                           endtime
           , substr(endtime, 1, 2) - substr(starttime, 1, 2) diff
      from meeting) t
         lateral view posexplode(split(space(cast(diff as int)), space(1))) tmp as pos, val
ID  HOUR
1	8
1	9
2	13
2	14
2	15
3	10
3	11
3	12
3	13
3	14
4	13
4	14
4	15
4	16
5	14
5	15
5	16
5	17
6	14
6	15
6	16
6	17
7	18
7	19

第二步:针对hour分组,求出count(*)大于等于2时的id即为重叠的会议室

 (1)先利用count(1) over(partition by hour) 进行辅助标记

select id
     ,count(1) over(partition by hour) flg
from (select id
           , starttime + pos as hour
      from (select id
                 , substr(starttime, 1, 2)                         starttime
                 , substr(endtime, 1, 2)                           endtime
                 , substr(endtime, 1, 2) - substr(starttime, 1, 2) diff
            from meeting) t
               lateral view posexplode(split(space(cast(diff as int)), space(1))) tmp as pos, val) t
1	8	1
1	9	1
3	10	1
3	11	1
3	12	1
4	13	3
2	13	3
3	13	3
4	14	5
6	14	5
5	14	5
3	14	5
2	14	5
5	15	4
6	15	4
2	15	4
4	15	4
5	16	3
6	16	3
4	16	3
5	17	2
6	17	2
7	18	1
7	19	1

(2)过滤出大于等于2的id,并去重获取最终结果

select id
from (select id
           , hour
           , count(1) over (partition by hour) flg
      from (select id
                 , starttime + pos as hour
            from (select id
                       , substr(starttime, 1, 2)                         starttime
                       , substr(endtime, 1, 2)                           endtime
                       , substr(endtime, 1, 2) - substr(starttime, 1, 2) diff
                  from meeting) t
                     lateral view posexplode(split(space(cast(diff as int)), space(1))) tmp as pos, val) t) t
where flg >= 2
group by id

 

方法2:利用数学区间讨论思想求解

详情具体参考文章:

SQL进阶技巧:如何按任意时段分析时间区间问题? | 分区间讨论【左、中、右】_sql按某时段日期区间聚合-CSDN博客

 具体讨论方法如下图1所示:

情况1:区间在右

判断条件 cet >= et and ct <= et          重叠区间为【ct,et]】

情况2:区间在内

判断条件为 ct>= st  and cet <= et      重叠区间为 【ct,cet】

情况3:区间在左

判断条件 ct <= st  and cet >= st        重叠区间为【st,cet】

第一步:先自关联,生成全量行行比较的数据集

select
from meeting a,meeting b
1	08:00	09:15	1	08:00	09:15
2	13:20	15:20	1	08:00	09:15
3	10:00	14:00	1	08:00	09:15
4	13:55	16:25	1	08:00	09:15
5	14:00	17:45	1	08:00	09:15
6	14:05	17:45	1	08:00	09:15
7	18:05	19:45	1	08:00	09:15
1	08:00	09:15	2	13:20	15:20
2	13:20	15:20	2	13:20	15:20
3	10:00	14:00	2	13:20	15:20
4	13:55	16:25	2	13:20	15:20
5	14:00	17:45	2	13:20	15:20
6	14:05	17:45	2	13:20	15:20
7	18:05	19:45	2	13:20	15:20
1	08:00	09:15	3	10:00	14:00
2	13:20	15:20	3	10:00	14:00
3	10:00	14:00	3	10:00	14:00
4	13:55	16:25	3	10:00	14:00
5	14:00	17:45	3	10:00	14:00
6	14:05	17:45	3	10:00	14:00
7	18:05	19:45	3	10:00	14:00
1	08:00	09:15	4	13:55	16:25
2	13:20	15:20	4	13:55	16:25
3	10:00	14:00	4	13:55	16:25
4	13:55	16:25	4	13:55	16:25
5	14:00	17:45	4	13:55	16:25
6	14:05	17:45	4	13:55	16:25
7	18:05	19:45	4	13:55	16:25
1	08:00	09:15	5	14:00	17:45
2	13:20	15:20	5	14:00	17:45
3	10:00	14:00	5	14:00	17:45
4	13:55	16:25	5	14:00	17:45
5	14:00	17:45	5	14:00	17:45
6	14:05	17:45	5	14:00	17:45
7	18:05	19:45	5	14:00	17:45
1	08:00	09:15	6	14:05	17:45
2	13:20	15:20	6	14:05	17:45
3	10:00	14:00	6	14:05	17:45
4	13:55	16:25	6	14:05	17:45
5	14:00	17:45	6	14:05	17:45
6	14:05	17:45	6	14:05	17:45
7	18:05	19:45	6	14:05	17:45
1	08:00	09:15	7	18:05	19:45
2	13:20	15:20	7	18:05	19:45
3	10:00	14:00	7	18:05	19:45
4	13:55	16:25	7	18:05	19:45
5	14:00	17:45	7	18:05	19:45
6	14:05	17:45	7	18:05	19:45
7	18:05	19:45	7	18:05	19:45

 第二步:利用图1所描述的关系进行行行比较判断。

最终SQL如下:

select distinct b.id
from meeting a,
     meeting b
where ((a.starttime >= b.starttime and a.starttime <= b.endtime)
    or (a.endtime >= b.starttime and a.endtime <= b.endtime))
  and a.id <> b.id

上述SQL可以进一步简化:图1中的三种情况只要满足如下表达式即都可以满足

三种情况合并为:

a.endtime >= b.starttime and  a.starttime <= b.endtime

最终优化调整后的SQL为:

select distinct b.id
from meeting a,
     meeting b
where a.endtime >= b.starttime
  and a.starttime <= b.endtime
  and a.id <> b.id

 

3 小结

本文利用SQL语言,通过两种方式给出了一种时间区间重叠问题的解决方案,并以实际场景为例子进行了详细讲解,其中方法2最为优雅,但需要通过区间讨论得出如下判断表达式,为本题的关键。

a.endtime >= b.starttime and  a.starttime <= b.endtime

对应图1关系为:

ct <= et   and  cet >= st

该表达式包含了图1三种 所有情况。

如果觉得本文对你有帮助,想进一步学习SQL语言这门艺术的,那么不妨也可以选择去看看我的博客专栏 ,部分内容如下:
数字化建设通关指南
专栏 原价99,现在活动价59.9,按照阶梯式增长,直到恢复原价。

专栏主要内容:
(1)SQL进阶实战技巧
可以参考如下教程,具体链接如下

SQL很简单,可你却写不好?也许这才是SQL最好的教程

上面链接中的文章及技巧会不定期更新。

(2)数仓建模实战技巧和个人心得
       1)新人入职新公司后应如何快速了解业务?

       2)以业务视角看宽表化建设?

       3)  维度建模 or 关系型建模?

       4)业务模型与数据模型有什么区别?业务阶段的模型该如何建设?

       5)业务指标体系该如何建设?指标体系该如何维护?指标平台应如何建设?指标体系                           该由谁来搭建?

       6)如何优雅设计DWS层?DWS层模型好坏该如何评价?

       7)指标发生异常,该如何排查?应从哪些方面入手寻找问题点?

       8) 数据架构的选择,mpp or hadoop?

       9)数仓团队应如何体现自己的业务价值,讲好数据故事?

      10)BI与大数据有什么关系?BI与信息化、数字化之间有什么关系?BI与报表之间的关                          系?

     11)数据部门如何与业务部门沟通,并规划指引业务需求?

文章不限于以上内容,有新的想法也会及时更新到该专栏。

具体专栏链接如下: 

 ​​​​​​数字化建设通关指南_莫叫石榴姐的博客-CSDN博客

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arm架构ceph pacific部署

背景 合作伙伴实验室的华为私有云原来使用单点的nfs做为存储设备&#xff0c;现有两方面考量&#xff0c;业务需要使用oss了&#xff0c;k8s集群及其他机器也需要一套可扩展的分布式文件系统 部署ceph 初始机器配置规划 IP配置主机名Role10.17.3.144c8g1T数据盘ceph-node01…

Apache Seatunnel Zeta引擎-启动脚本分析

Apache SeaTunnel Zeta引擎的集群模式启动的第一步是执行bin/seatunnel-cluster.sh脚本&#xff0c;所以先来学习下这个脚本。 脚本执行流程分析 脚本简要注释 #!/bin/bash # # Licensed to the Apache Software Foundation (ASF) under one or more # contributor license a…

Java项目:154 基于ssm旅游信息网站(含论文+ppt)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 使用旅游信息网站的分为管理员和用户两个角色的权限子模块。 管理员所能使用的功能主要有&#xff1a;个人中心、用户管理、旅游景点管理、交…

双指齐下:那晚我与算法的不解之缘

公主请阅 1.快乐数1.1题目说明示例 1示例 2 1.3题目分析1.4代码部分1.5代码解析 2.复写02.1题目说明示例 1示例 2 2.2题目分析2.3代码部分2.4代码解析 1.快乐数 题目传送门 1.1题目说明 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为&#xff1a; 对于一个正…

探索 Blob 对象的应用场景和实例分析

一. 引言 当我们在开发 Web 应用程序时&#xff0c;常常会遇到需要处理二进制数据的情况。这时&#xff0c;Blob&#xff08;Binary Large Object&#xff09;对象就成为了一个非常有用的工具。Blob 对象可以用来表示一段二进制数据&#xff0c;它可以存储和操作各种类型的数据…

FPAG学习(5)-三种方法实现LED流水灯

目录 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 1.1.2仿真代码 1.1.3仿真 1.2实验结果 1.2.1总结 2.循环移位实现LED流水灯 3.38译码器实现LED流水灯 3.1原理 3.2源程序 1.移位实现LED流水灯 1.1创建工程及源文件代码 1.1.1源代码 利用计数器计数到…

Python网络爬虫从入门到实战

目录 引言 一、网络爬虫的概念 二、 网络爬虫的基本工作流程 &#xff08;一&#xff09;过程&#xff1a; &#xff08;二&#xff09;安装requests模块和beautifulsoup4模块 &#xff08;三&#xff09;requests库的使用 1、requests库的基本介绍 2、导入requests库的…

IO作业代码

问题 通过 fwrite和 fread去拷贝 文件到另外一个文件上 #include<myhead.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include<errno.h> #include<time.h> int main(int argc, const char *argv[]) { FILE *fp fo…

新款任天堂switch游戏机方案,支持4K60HZ投屏方案,显示器,手柄方案

据传任天堂将推出新的一代的switch掌机&#xff0c;而新款掌机将支持4K60HZ投屏 都2402年了再做1080P确实有点不太象话了 4K60HZ相较于1080P能够提升很多游戏体验&#xff0c;这时不管是HDMI显示器或者是VR眼睛清晰度都会让人舒服很多。 不过新一代的任天堂似乎也在PD协议上…

答题pk小程序的技术特点和性能优势分析

答题小程序是一种在移动设备上运行的应用程序&#xff0c;旨在提供各种类型的答题体验。以下是答题小程序的一些特点和优势&#xff1a; 一、特点 多样化的题目类型&#xff1a; 包括选择题、填空题、判断题等常见题型&#xff0c;还可能有简答题、论述题等更具挑战性的题型。…

qt+opengl 实现纹理贴图,平移旋转,绘制三角形,方形

1 首先qt 已经封装了opengl&#xff0c;那么我们就可以直接用了&#xff0c;这里面有三个函数需要继承 virtual void initializeGL() override; virtual void resizeGL(int w,int h) override; virtual void paintGL() override; 这三个函数是实现opengl的重要函数。 2 我们…

arp欺骗及其实验

ARP欺骗&#xff08;ARP Spoofing&#xff09;是一种网络攻击技术&#xff0c;攻击者通过伪造ARP&#xff08;地址解析协议&#xff09;消息&#xff0c;将其MAC地址与目标IP地址关联&#xff0c;从而实现对网络流量的截获、篡改或重定向。以下是ARP欺骗的详细信息&#xff1a;…

【JVM】—Java内存区域详解

Java内存区域详解 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点个star~&#x1f60a; 文章目录 Java内存区域详解1 线程私有1…

Linux系统:Ubuntu上安装Chrome浏览器

Ubuntu系统版本&#xff1a;23.04 在Ubuntu系统上安装Google Chrome浏览器&#xff0c;可以通过以下步骤进行&#xff1a; 终端输入以下命令&#xff0c;先更新软件源&#xff1a; sudo apt update 或 sudo apt upgrade终端输入以下命令&#xff0c;下载最新的Google Chrome .…

瑞芯微RK3566/RK3568 Android11使用OTA升级固件方法,深圳触觉智能鸿蒙开发板演示,备战第九届华为ICT大赛

本文介绍瑞芯微RK3566/RK3568在Android11系统OTA升级固件方法&#xff0c;使用触觉智能的Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566&#xff0c;Laval官方社区主荐&#xff01; 1、OTA包生成 在源码根目录上执行以下命令编译OTA包 # make installclean # …

Docker实践与应用举例

目录 1. 引言 2. Docker的基本概念 2.1 什么是Docker容器 2.2 Docker镜像 2.3 Docker架构 3. Docker的应用场景 3.1 开发与测试环境的隔离 3.2 持续集成与持续交付&#xff08;CI/CD&#xff09; 3.3 微服务架构 4. Docker的实践案例 4.1 部署Nginx反向代理 4.2 使用…

端到端的开源OCR模型:GOT-OCR-2.0,支持场景文本、文档、乐谱、图表、数学公式等内容识别!

今天给大家分享一个端到端的开源 OCR 模型&#xff0c;号称 OCR 2.0&#xff01; 支持场景文本、文档、乐谱、图表、数学公式等内容识别&#xff0c;拿到了 BLEU 0.972 高分。 从给出的演示图来看&#xff0c;一些非常复杂的数学公式都能正确的识别&#xff0c;颇为强大。模型…

文件IO(Linux文件IO)

前言 本文介绍Linux系统下自带的文件IO的函数。 Linux文件IO相关函数 open函数 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode)…

JAVA就业笔记8——第二阶段(5)

课程须知 A类知识&#xff1a;工作和面试常用&#xff0c;代码必须要手敲&#xff0c;需要掌握。 B类知识&#xff1a;面试会问道&#xff0c;工作不常用&#xff0c;代码不需要手敲&#xff0c;理解能正确表达即可。 C类知识&#xff1a;工作和面试不常用&#xff0c;代码不…

Spire.PDF for .NET【页面设置】演示:在 C#/VB.NET 中创建 PDF 小册子

当人们打印大型 PDF 文档时&#xff0c;PDF 小册子非常有用。它在书籍、报纸和杂志编辑中特别受欢迎。本节将介绍一种通过C#、VB.NET 中的.NET PDF组件创建 PDF 小册子的非常简单的方法。 Spire.PDF for .NET 是一款独立 PDF 控件&#xff0c;用于 .NET 程序中创建、编辑和操作…