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…...
多线程理论及操作
【一】什么是线程 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程 一条流水线必须属于一个车间,一个车间的工作过程是一个进程 车间负责把资源整合到一起ÿ…...
OpenClaw+百川2-13B:技术面试题库自动更新与练习
OpenClaw百川2-13B:技术面试题库自动更新与练习 1. 为什么需要自动化面试题库 去年准备跳槽时,我发现自己收藏的面试题文档已经两年没更新了。技术栈迭代太快,LeetCode题库每月新增上百道题,手动维护题库就像用勺子舀干海水。直…...
Chandra效果实测:100轮连续中文对话稳定性与上下文保持能力验证
Chandra效果实测:100轮连续中文对话稳定性与上下文保持能力验证 测试背景说明:本次测试基于CSDN星图平台的Chandra镜像,在标准配置环境下进行100轮连续中文对话,全面评估其长时间运行的稳定性、上下文理解能力和响应表现。 1. 测试…...
基于单片机的智能路灯控制系统设计 | 附源码
源码:点击获取源码 一、项目背景 本项目是单片机课程设计作品,旨在模拟城市路灯的智能化管理场景。传统的路灯控制方式通常依赖人工开关或简单的定时控制,存在能源浪费、维护困难等问题。随着智慧城市概念的提出,智能路灯系统成…...
OpenClaw安全实践:gemma-3-12b-it本地化保障敏感数据边界
OpenClaw安全实践:gemma-3-12b-it本地化保障敏感数据边界 1. 为什么需要本地化部署? 去年处理季度财报时,我犯过一个至今心有余悸的错误。当时用某公有云API自动分析Excel中的财务数据,结果在调试时不小心把包含客户银行账号的测…...
Linux dd命令的深度解析与应用实践
dd 命令概述命令起源与定位dd 命令最早出现在 UNIX 操作系统中,后被移植到 Linux 平台。它不同于普通的文件复制命令(如 cp),dd 以底层块设备的方式操作数据,可以精确控制数据流的每一个细节。这种特性使其成为&#x…...
代码随想录算法第五十三天| KamaCoder110字符串迁移、KamaCoder105有向图的完全联通、KamaCoder106海岸线的计算
KamaCoder 110 字符串迁移 题目链接:110.字符串迁移 文档讲解:代码随想录 视频讲解: 字符串迁移 思路与感想:直接卡在读懂题意这一关了,我还纳闷输出结果怎么跟自己理解的差那么多。卡哥讲完之后才明白题目的推导过程…...
使用PHP Imagick扩展将PDF转换为图片功能的完整方案
引言在开发中,经常需要将 PDF 文档转换为图片格式,以便于在线预览、生成缩略图或进行其他图像处理操作。PHP 的 Imagick 扩展提供了强大的图像处理能力,可以轻松实现这一需求。本文将介绍如何使用 Imagick 扩展创建一个高效的 PDF 转图片工具…...
Win11升级还是全新安装?保姆级决策指南与数据迁移全流程
Win11升级还是全新安装?保姆级决策指南与数据迁移全流程 每次Windows重大版本更新,用户都会面临一个经典难题:是选择保留数据的平滑升级,还是彻底格式化重装系统?这个问题在Win11时代尤为突出——新系统带来的界面革新…...
nRF52硬件PWM深度解析:高精度、低抖动、多通道实时控制
1. nRF52_PWM硬件PWM库深度技术解析1.1 硬件PWM的工程必要性与nRF52平台特性在嵌入式实时控制系统中,PWM(脉宽调制)信号的质量直接决定执行机构的响应精度与系统稳定性。软件定时器实现的PWM(如基于millis()或micros()的循环轮询&…...
Windows Defender一键移除工具:终极完整指南,三步彻底关闭系统安全防护
Windows Defender一键移除工具:终极完整指南,三步彻底关闭系统安全防护 【免费下载链接】windows-defender-remover A tool which is uses to remove Windows Defender in Windows 8.x, Windows 10 (every version) and Windows 11. 项目地址: https:/…...
