HQL面试题练习 —— 合并活动日期
目录
- 1 题目
- 2 建表语句
- 3 题解
1 题目
已知有表记录了每个大厅的活动开始日期和结束日期,每个大厅可以有多个活动。请编写一个SQL查询合并在同一个大厅举行的所有重叠的活动,如果两个活动至少有一天相同,那他们就是重叠的,请将他们的交叉的日期合并。
+----------+-------------+-------------+
| hall_id | start_date | end_date |
+----------+-------------+-------------+
| 1 | 2023-01-13 | 2023-01-14 |
| 1 | 2023-01-14 | 2023-01-17 |
| 1 | 2023-01-18 | 2023-01-25 |
| 2 | 2022-12-09 | 2022-12-23 |
| 2 | 2022-12-13 | 2022-12-17 |
| 3 | 2022-12-01 | 2023-01-30 |
+----------+-------------+-------------+
结果如下:
+----------+-------------+-------------+
| hall_id | start_date | end_date |
+----------+-------------+-------------+
| 1 | 2023-01-13 | 2023-01-17 |
| 1 | 2023-01-18 | 2023-01-25 |
| 2 | 2022-12-09 | 2022-12-23 |
| 3 | 2022-12-01 | 2023-01-30 |
+----------+-------------+-------------+
解释:两个活动
["2823-01-13","2023-01-14"]
和[“2023-01-14","2023-01-17"]
重叠,我们将它们合并到一个活动中[“2023-01-13","2023-01-17"]
。["2023-01-18","2023-01-25"]
不与任何其他活动重叠,所以我们保持原样。
2 建表语句
--建表语句
CREATE TABLE IF NOT EXISTS t_hall_event (hall_id STRING, --大厅IDstart_date STRING, -- 营销活动开始日期end_date STRING -- 营销活动结束日期
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC;
--数据插入
insert into t_hall_event(hall_id, start_date, end_date) values
('1','2023-01-13','2023-01-14'),
('1','2023-01-14','2023-01-17'),
('1','2023-01-18','2023-01-25'),
('2','2022-12-09','2022-12-23'),
('2','2022-12-13','2022-12-17'),
('3','2022-12-01','2023-01-30');
3 题解
我们首先按照 hall_id
分组,根据 start_date
、end_date
升序排列,按照start_date
进行了升序排列,所以当前行的start_date
一定晚于前一行的start_date
,我们只需要对当前行的start_date
和上一行的end_date
进行比较,如果当前行的start_date
小于等于前一行的end_date
代表有交叉,可以合并,否则代表不可合并。判断出是否可以合并之后,具体操作合并就转化成类似连续问题了。
第一步:先使用 lag()
函数进行开窗,取到上一行的 end_date
selecthall_id,start_date,end_date,lag(end_date) over (partition by hall_id order by start_date,end_date) as last_end_date
from t_hall_event
结果如下:
+----------+-------------+-------------+----------------+
| hall_id | start_date | end_date | last_end_date |
+----------+-------------+-------------+----------------+
| 1 | 2023-01-13 | 2023-01-14 | NULL |
| 1 | 2023-01-14 | 2023-01-17 | 2023-01-14 |
| 1 | 2023-01-18 | 2023-01-25 | 2023-01-17 |
| 2 | 2022-12-09 | 2022-12-23 | NULL |
| 2 | 2022-12-13 | 2022-12-17 | 2022-12-23 |
| 3 | 2022-12-01 | 2023-01-30 | NULL |
+----------+-------------+-------------+----------------+
第二步:根据当前行的 start_day
与上一行的 end_day
进行比较,得出是否可以合并标记;
select hall_id,start_date,end_date,last_end_date,if(start_date <= last_end_date, 0, 1) as is_merge --0:合并,1:不合并
from (select hall_id,start_date,end_date,lag(end_date) over (partition by hall_id order by start_date asc,end_date asc) as last_end_datefrom t_hall_event) t
结果如下:
+----------+-------------+-------------+----------------+-----------+
| hall_id | start_date | end_date | last_end_date | is_merge |
+----------+-------------+-------------+----------------+-----------+
| 1 | 2023-01-13 | 2023-01-14 | NULL | 1 |
| 1 | 2023-01-14 | 2023-01-17 | 2023-01-14 | 0 |
| 1 | 2023-01-18 | 2023-01-25 | 2023-01-17 | 1 |
| 2 | 2022-12-09 | 2022-12-23 | NULL | 1 |
| 2 | 2022-12-13 | 2022-12-17 | 2022-12-23 | 0 |
| 3 | 2022-12-01 | 2023-01-30 | NULL | 1 |
+----------+-------------+-------------+----------------+-----------+
第三步:连续问题,使用 sum() over() 进行分组;
selecthall_id,start_date,end_date,last_end_date,is_merge,sum(is_merge)over(partition by hall_id order by start_date asc,end_date asc) as group_idfrom(selecthall_id,start_date,end_date,last_end_date,if(start_date<=last_end_date,0,1) as is_merge --0:合并,1:不合并from(selecthall_id,start_date,end_date,lag(end_date)over(partition by hall_id order by start_date asc,end_date asc) as last_end_datefrom t_hall_event)t) tt
结果如下:
+----------+-------------+-------------+----------------+-----------+-----------+
| hall_id | start_date | end_date | last_end_date | is_merge | group_id |
+----------+-------------+-------------+----------------+-----------+-----------+
| 1 | 2023-01-13 | 2023-01-14 | NULL | 1 | 1 |
| 1 | 2023-01-14 | 2023-01-17 | 2023-01-14 | 0 | 1 |
| 1 | 2023-01-18 | 2023-01-25 | 2023-01-17 | 1 | 2 |
| 2 | 2022-12-09 | 2022-12-23 | NULL | 1 | 1 |
| 2 | 2022-12-13 | 2022-12-17 | 2022-12-23 | 0 | 1 |
| 3 | 2022-12-01 | 2023-01-30 | NULL | 1 | 1 |
+----------+-------------+-------------+----------------+-----------+-----------+
第四步:取每个组内的 start_day
的最小值作为活动开始日期,end_day
的最大值作为活动结束日期,得到最终结果。注意分组条件为 hall_id
+group_id
。
selecthall_id,min(start_date) as start_date,max(end_date) as end_datefrom(selecthall_id,start_date,end_date,last_end_date,is_merge,sum(is_merge)over(partition by hall_id order by start_date asc,end_date asc) as group_idfrom(selecthall_id,start_date,end_date,last_end_date,if(start_date<=last_end_date,0,1) as is_merge --0:合并,1:不合并from(selecthall_id,start_date,end_date,lag(end_date)over(partition by hall_id order by start_date asc,end_date asc) as last_end_datefrom t_hall_event)t) tt) tttgroup by hall_id,group_id --注意这里的分组,有group_id
结果如下:
+----------+-------------+-------------+
| hall_id | start_date | end_date |
+----------+-------------+-------------+
| 1 | 2023-01-13 | 2023-01-17 |
| 1 | 2023-01-18 | 2023-01-25 |
| 2 | 2022-12-09 | 2022-12-23 |
| 3 | 2022-12-01 | 2023-01-30 |
+----------+-------------+-------------+
相关文章:
HQL面试题练习 —— 合并活动日期
目录 1 题目2 建表语句3 题解 1 题目 已知有表记录了每个大厅的活动开始日期和结束日期,每个大厅可以有多个活动。请编写一个SQL查询合并在同一个大厅举行的所有重叠的活动,如果两个活动至少有一天相同,那他们就是重叠的,请将他们…...

基于SVm和随机森林算法模型的中国黄金价格预测分析与研究
摘要 本研究基于回归模型,运用支持向量机(SVM)、决策树和随机森林算法,对中国黄金价格进行预测分析。通过历史黄金价格数据的分析和特征工程,建立了相应的预测模型,并利用SVM、决策树和随机森林算法进行训…...
Host头攻击-使用反向代理服务器或负载均衡器来传递路由信息
反向代理服务器的作用 安全性:反向代理服务器位于Web服务器之前,可以隐藏实际Web服务器的身份和地址,从而增加安全性。它还可以对客户端请求进行过滤和检查,以防止潜在的攻击。负载均衡:反向代理服务器可以将客户端请…...

AWS容器之Amazon ECS
Amazon Elastic Container Service(Amazon ECS)是亚马逊提供的一种完全托管的容器编排服务,用于在云中运行、扩展和管理Docker容器化的应用程序。可以理解为Docker在云中对应的服务就是ECS。...

win10/win11 优先调用大核的电源计划性能设置
前言 大小核,即Intel 12代开始的P-core(性能核,一般叫大核)和E-core(能效核,一般叫小核)异核架构。说下个人理解,就是英特尔为了增加cpu性能,但是又因为架构和功耗的限制…...

模型实战(20)之 yolov8分类模型训练自己的数据集
yolov8分类模型训练自己的数据集 yolov8,一个实时快速的端到端的集检测、分割、分类、姿态识别于一体的视觉算法库/框架本文将给出yolov8 分类模型的数据集制作格式及训练流程 1. 环境搭建 关于虚拟环境的搭建真的是老生常谈了,给出一个简单的搭建流程吧#新建虚拟环境 conda …...

好消息!PMP纸质证书可以领取啦!(22年11月至23年8月)
上周五,中国国际人才交流基金会官方发布了《关于2022年11月和2023年3月、5月、8月PMI认证考试证书领取》的通知,具体内容如下: 之前顺利通过PMP/ACP/PgMP考试的同学抓紧时间,在5月24日—6月10日内进入官网上登记领取证书。 PMP考…...
select函数(Unix系统)
select函数(Unix系统) 一、函数格式二、参数及返回值2.1 struct fd_set 结构体2.1 struct timeval 结构体2.3 函数参数2.4 返回值 三、用法举例3.1 监控终端输入内容 一、函数格式 #include <sys/time.h>#include <sys/types.h>#include <…...

设计模式16——策略模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 策略模式(Strategy…...

Putty: 随心御剑——远程启动服务工具plink
一、引言:如何远程控制 也许你会有这样的场景,交互程序(以下简称UI程序)跑在windows端,而控制程序跑在Linux上。我们想要通过windows端 UI程序来启动Linux下面的服务,来一场酣畅淋漓的御剑飞行咋办,难道要自己十年磨一剑,在Linux下编写一个受控服务程序么.计算机科技发…...

Vectorworks 2024 Mac安装包下载Vectorworks 2024安装教程3D建模设计工具
安装 步骤 1,双击下载好的安装包,打开。 2,将G1DXHL.ldf拖到桌面上备用。 3,返回打开的镜像 选择install vectorworks2024 双击打开启动安装程序。电脑就90hi高腰腿疼痛和Y&Aaa9yY 4,输入电脑密码。 5࿰…...
CSRF 攻击详解
什么是csrf攻击? CSRF攻击(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络攻击方式,它利用网站对用户浏览器的信任,诱使用户在不知情的情况下发送恶意请求。这类攻击通常发生在用户已经通过身…...

单链表OJ题(课堂总结)
1.链表的带环问题 上图就是一个典型的带环链表 1.1如何判读链表是否带环? 最常见的方法就是利用快慢指针,快指针追加慢指针,当二者相等的时候即可判断链表带环 其实现的代码如下: bool hasCycle(struct ListNode*head) { s…...

cad角度如何精确到0.1
可以通过更改角度精度的方式把角度的标注精确到小数点后几位,具体方法如下: 1、打开一个CAD文档,在文档中画一个角,如下图: 文章源自设计学徒自学网-https://www.sx1c.com/47920.html 2、给此角进行角度的标注&#…...

STM32H743+USBHID+CubeMX配置
一、环境准备 电脑系统:Windows 10 专业版 20H2 IDE:Keil v5.35、STM32CubeMX v6.5.0 测试硬件:正点原子阿波罗STM32H743 二、测试步骤 1、使用用例工程 配置STM32H743定时器功能-CSDN博客https://blog.csdn.net/horse_2007s/article/d…...
路由传参和获取参数的三种方式
路由传参和获取参数在前端开发中是一个常见的需求,特别是在使用如 Vue.js、React 等前端框架时。下面,我将以 Vue.js 为例,介绍三种常见的路由传参和获取参数的方式: 1. 使用 params 传参 传参: 在路由配置中&#…...
代码随想录算法训练营第四十一天|509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
代码随想录算法训练营第四十一天 509. 斐波那契数 题目链接:509. 斐波那契数 动规五部曲: 确定dp数组以及下标的含义:第i个数的斐波那契数值是dp[i]确定递推公式:dp[i] dp[i - 1] dp[i - 2];dp数组如何初始化:dp[…...
HTML5表单控件:新时代的交互魔法手册
🚀HTML5表单控件:新时代的交互魔法手册 🎯HTML5表单控件速览:新面孔,新功能1. 日期时间选择器(Date & Time Picker)2. 数字输入框(Number Input)3. 搜索框࿰…...

WordPress安装插件失败No working transports found
1. 背景(Situation) WordPress 社区有非常多的主题和插件,大部分人用 WordPress 都是为了这些免费好用的主题和插件。但是今天安装完 WordPress 后安装插件时出现了错误提示:“ 安装失败:下载失败。 No working trans…...
多线程理论及操作
【一】什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程 一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合到一起ÿ…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Typeerror: cannot read properties of undefined (reading ‘XXX‘)
最近需要在离线机器上运行软件,所以得把软件用docker打包起来,大部分功能都没问题,出了一个奇怪的事情。同样的代码,在本机上用vscode可以运行起来,但是打包之后在docker里出现了问题。使用的是dialog组件,…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...