大数据面试SQL(一):合并日期重叠的活动

news2025/1/10 20:55:34

文章目录

合并日期重叠的活动

一、题目

二、分析

三、SQL实战

四、样例数据参考


合并日期重叠的活动

一、题目

已知有表记录了每个品牌的活动开始日期和结束日期,每个品牌可以有多个活动。请编写一个SQL查询合并在同一个品牌举行的所有重叠的活动,如果两个活动至少有一天相同,那他们就是重叠的。

样例数据:

目标结果:

解释:

有两个品牌,分别为小米和华为。

小米:

  • 两个活动["2024-01-13","2023-01-20"]和[“2024-01-14","2024-01-17"]重叠,我们将它们合并到一个活动中[“2024-01-13","2024-01-20"]。

华为:

  • ["2024-11-09","2024-12-07"]不与任何其他活动重叠,所以我们保持原样。

二、分析

我们首先按照brand分组,根据start_date、end_date 升序排列,按照start_date 进行了升序排列,所以当前行的start_date一定晚于前一行的start_date,对当前行的start_date 和截止到上一行的最大end_date进行比较,如果当前行的start_date 小于等于截止到前一行最大end_date 代表有交叉,可以合并,否则代表不可合并。判断出是否可以合并之后,具体操作合并就转化成类似连续问题。

维度评分
题目难度⭐️⭐️⭐️⭐️⭐️
题目清晰度⭐️⭐️⭐️⭐️⭐️
业务常见度⭐️⭐️⭐️⭐️

三、SQL实战

1、使用max()函数开窗,获得截止到当前行之前的活动最后日期

这里我们使用max(),按照brand进行分组,然后根据start_date和end_date进行排序,利用聚合函数开窗,开窗函数内有排序则聚合到当前行的特性,进行处理。其中我们这边需要聚合到当前行的上一行。 

执行SQL

select
    brand,
    start_date,
    end_date,
    max(end_date) over (partition by brand order by start_date asc,end_date asc rows between unbounded preceding and 1 preceding) as max_end_date
from t1_brand_event;

2、根据当前行的start_day与max_end_date进行比较,得出是否可以合并标记

执行SQL 

select brand,
       start_date,
       end_date,
       max_end_date,
       if(start_date <= max_end_date, 0, 1) as is_merge --0:合并,1:不合并
from (select brand,
             start_date,
             end_date,
             max(end_date)
                 over (partition by brand order by start_date asc,end_date asc rows between unbounded preceding and 1 preceding) as max_end_date
      from t1_brand_event) t

3、连续问题,使用sum()over()进行分组

执行SQL

select brand,
       start_date,
       end_date,
       max_end_date,
       is_merge,
       sum(is_merge) over (partition by brand order by start_date asc,end_date asc) as group_id
from (select brand,
             start_date,
             end_date,
             max_end_date,
             if(start_date <= max_end_date, 0, 1) as is_merge --0:合并,1:不合并
      from (select brand,
                   start_date,
                   end_date,
                   max(end_date)
                       over (partition by brand order by start_date asc,end_date asc rows between unbounded preceding and 1 preceding) as max_end_date
            from t1_brand_event) t) tt;

4、完成合并,得到最终结果

取每个组内的start_day 的最小值作为活动开始日期,end_day的最大值作为活动结束日期,得到最终结果。

注意分组条件为:brand+group_id

执行SQL

select brand,
       min(start_date) as start_date,
       max(end_date)   as end_date
from (select brand,
             start_date,
             end_date,
             max_end_date,
             is_merge,
             sum(is_merge) over (partition by brand order by start_date asc,end_date asc) as group_id
      from (select brand,
                   start_date,
                   end_date,
                   max_end_date,
                   if(start_date <= max_end_date, 0, 1) as is_merge --0:合并,1:不合并
            from (select brand,
                         start_date,
                         end_date,
                         max(end_date)
                             over (partition by brand order by start_date asc,end_date asc rows between unbounded preceding and 1 preceding) as max_end_date
                  from t1_brand_event) t) tt) ttt
group by brand, group_id; --注意这里的分组,有group_id

四、样例数据参考

--建表语句
CREATE TABLE IF NOT EXISTS t1_brand_event (
    brand STRING, --品牌
    start_date STRING, -- 营销活动开始日期
    end_date STRING -- 营销活动结束日期
);
--数据插入
insert into  t1_brand_event(brand, start_date, end_date) values
('小米','2024-01-13','2024-01-20'),
('小米','2024-01-14','2024-01-17'),
('小米','2024-01-14','2024-01-16'),
('小米','2024-01-18','2024-01-25'),
('小米','2024-01-20','2024-01-26'),
('华为','2024-11-09','2024-12-07'),
('华为','2024-12-09','2024-12-23'),
('华为','2024-12-13','2024-12-17'),
('华为','2024-12-20','2024-12-24'),
('华为','2024-12-25','2024-12-30'),
('OPPO','2023-12-01','2024-01-30'),
('OPPO','2023-12-31','2024-06-30');

  • 📢博客主页:https://lansonli.blog.csdn.net
  • 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
  • 📢本文由 Lansonli 原创,首发于 CSDN博客🙉
  • 📢停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活✨

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

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

相关文章

Canvas简历编辑器-图形绘制与状态管理(轻量级DOM)

Canvas简历编辑器-图形绘制与状态管理(轻量级DOM) 在前边我们聊了数据结构的设计和剪贴板的数据操作&#xff0c;那么这些操作都还是比较倾向于数据相关的操作&#xff0c;那么我们现在就来聊聊基本的图形绘制以及图形状态管理。 在线编辑: https://windrunnermax.github.io/…

树与二叉树、图的基本概念

一、树与二叉树的基本概念和性质 1、树的的性质&#xff1a; 1&#xff09;树中的结点数 n 等于所有结点的度数之和加 1 【说明】结点的度是指该结点的孩子数量&#xff0c;每个结点与其每个孩子都由唯一的边相连&#xff0c;因此树中所有结点的度数之和等于树中的边数之和。…

模型 MBTI(性格模型)

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。探索真我&#xff0c;和谐人际。 1 MBTI性格模型的应用 1.1 跨国公司团队协作改进 ABC公司是一家全球性的科技公司&#xff0c;其研发团队由来自世界各地的工程师和设计师组成。尽管团队成员个个才华…

创意指南丨AR数学沉浸式空间体验

AR学习种类那么多&#xff0c;哪款最吸引你&#xff1f; 星河造梦坊和Unity联手打造的沉浸式空间AR无疑是其中的佼佼者。 这款应用不仅利用AR技术将抽象的数学概念变得生动有趣&#xff0c;还通过互动体验让学习者仿佛置身于一个充满奇幻色彩的数学世界中。 无论是学生还是教…

鸿蒙应用服务开发【自定义通知角标】

自定义通知角标 介绍 本示例主要展示了设定应用的桌面图标角标的功能&#xff0c;使用ohos.notificationManager接口&#xff0c;进行桌面角标的设置&#xff0c;通知的发送&#xff0c;获取等。 效果预览 使用说明 在主界面&#xff0c;可以看到当前应用的所有消息通知&am…

ts-node 报错 ERR_UNKNOWN_FILE_EXTENSION

问题 有个monorepo项目&#xff0c;在最外层一次性打包 3 个项目的脚本已经成功实现&#xff0c;如下&#xff1a; "build:test": "cross-env NODE_ENVtest vite build --mode test && esno ./build/script/postBuild.ts", "build:prod"…

一款基于RBAC模型的开源快速开发平台,支持权限粒度达到列级别,前后端分离,可免费用于商业

前言 在企业级应用开发中&#xff0c;权限管理和系统配置是两个核心问题。传统的开发模式往往面临权限控制不够灵活、系统配置难以管理等挑战。为了解-决这些问题&#xff0c;需要一款能够提供细致权限控制和灵活系统配置的软件。 现有的一些软件虽然提供了基本的权限管理功能…

索尼相机SD卡找不到视频怎么办?提供全面解决方案

在使用索尼相机拍摄美好瞬间时&#xff0c;SD卡作为存储介质&#xff0c;承载着珍贵的视频和照片。然而&#xff0c;有时我们可能会遇到SD卡中视频文件无法找到的问题&#xff0c;这无疑让人倍感焦虑。本文旨在为大家提供一套全面的解决方案&#xff0c;希望帮助大家快速找回丢…

Istio 金丝雀发布

转载&#xff1a;备考ICA-Istio 金丝雀实验4 环境清理 kubectl delete gw/helloworld-gateway vs/helloworld dr/helloworld-destination #测试 kubectl get svc,pods for i in {1..10};do curl $(kubectl get svc helloworld|grep helloworld|awk {print $3":"$5}|a…

谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据

本节的主要内容是在前一节的基础上&#xff0c;提供结构查询出所有的二级、三级分类数据。 一&#xff0c;构造响应体数据结构 后端返回给前端的数据结构是在开发详细设计中应该确定的内容。 分析前端需要的数据结构&#xff0c;后端要将所有一级分类包含的二级和三级分类信…

嵌入式学习之路 14(C语言基础学习——指针)

一、指针基础 指针的概念 地址表示内存单元的编号&#xff0c;也被称为指针。指针既是地址&#xff0c;也是一种专门用于处理地址数据的数据类型。 例如&#xff0c;变量a的地址或者十六进制表示的0x1000都可以视作指针。 指针变量的定义 语法&#xff1a;基类型 * 指针变…

Python面试宝典第28题:合并区间

题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为intervals[i] [starti, endi]&#xff0c;且endi大于starti。请合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间。 示例 1&#xff1a; 输入&…

Linux 利用 iostat 和 iotop 进行 IO 分析

目录 一、概述二、iostat1、下载2、常用选项3、/proc/diskstats 文件3、一般使用 三、iostop1、下载2、常用选项3、一般使用 一、概述 在Linux 系统上&#xff0c;iostat 和 iotop 这两个 IO 数据工具非常常用。它们都是性能分析领域中不可缺少的工具性软件。 如果 Linux 系统…

关于Redis的集群面试题

问题一&#xff1a;Redis的多数据库机制&#xff0c;了解多少&#xff1f; Redis支持多个数据库&#xff0c;并且每个数据库是隔离的不能共享&#xff0c;单机下的redis可以支持16个数据库&#xff08;db0~db15&#xff09;;若在Redis Cluster集群架构下&#xff0c;则只有一个…

基于STM32F103的FreeRTOS系列(七)·任务创建·列表的使用超详细解析

目录 1. 列表和列表项 1.1 列表和列表项简介 1.1.1 列表 1.1.2 列表项 1.1.3 迷你列表项 1.1.4 列表与列表项关系图 1.2 列表初始化 1.3 列表项的初始化 1.4 列表项的插入函数 1.5 列表项的末尾插入 1.6 列表项的删除 1.7 列表的遍历 1. 列表和列表项…

Open3D 三维重建-Marching Cubes (行进立方体)

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1步骤 2.1.2函数代码 2.2完整代码 三、实现效果 3.1原始点云 3.2重建后点云 Open3D点云算法汇总及实战案例汇总的目录地址&#xff1a; Open3D点云算法与点云深度学习案例汇总&#…

基于Flask框架的豆瓣电影实时数据分析可视化系统【自动爬虫、数据库、Pyecharts】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍数据抓取数据存储可视化前后端交互登陆界面注册界面数据更新后展示每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 项目介绍 本项目基于Py…

JavaEE: 线程安全问题的解决方案(synchronized)

发生原因 要想解决线程安全问题,那么我们首先得知道线程安全问题为什么会发生. 发生原因: 线程在操作系统中是"随机调度,抢占式执行的"[根本原因].多个线程,同时修改同一个变量修改操作不是"原子"的内存可见性问题指令重排序 解决方案 原因1和2,我们很…

基于YOLOv8的茶叶病变检测系统

基于YOLOv8的茶叶病变检测系统 (价格85) 包含 [Algal Leaf Spot, Brown Blight, Gray Blight, Healthy, Helopeltis, Red Leaf Spot] 6个类 翻译&#xff1a; [藻类叶斑病&#xff0c;褐疫病&#xff0c;灰疫病&#xff0c;健康&#xff0c;茶角盲蝽&#xff0c; 红叶斑…

08.SQL注入-下(超详细!!!)

1、Access注入 1.1 判断是否存在注入漏洞 ?id10 and 11 //不报错 ?id10 and 12 //报错1.2 判断字段数 ?id10 order by 1 ... ?id10 order by 7 //不报错 ?id10 order by 8 //报错 说明有7个字段1.3 猜表名 ?id10 and exists(select * from administrator) …