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

文章目录

合并日期重叠的活动

一、题目

二、分析

三、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

selectbrand,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_datefrom 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_datefrom 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_idfrom (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_datefrom 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.rhkb.cn/news/393607.html

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

相关文章

手机在网时长查询接口如何对接?(一)

一、什么是手机在网时长查询接口&#xff1f; 传入手机号码&#xff0c;查询该手机号的在网时长&#xff0c;返回时间区间&#xff0c;支持携号转网号码查询。 二、手机在网时长查询接口适用于哪些场景&#xff1f; 例如&#xff1a;客户画像与精准营销 &#xff08;1&…

ROS 7上实现私网互通方案

一、背景: 第一个私网现状:连接公域网是由tp-link进行拨号链接使用动态公网ip,内部网段是192.168.1.0/24 第二个私网现状:连接公域网是机房的固定公网ip,内部网段为10.0.0.0/16二、目标 安全的打通192.168.1.0/24和10.0.0.0/16的网络, 使得前者局域网中的机器能够安全访…

C#使用Socket实现TCP服务器端

1、TCP服务器实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks;namespace PtLib.TcpServer {public delegate void Tcp…

浏览器渲染树的形成原理,你真的懂吗?

一、浏览器渲染的基本流程 解析 HTML 当用户在浏览器中输入网址或点击链接时&#xff0c;浏览器会向服务器发送请求获取 HTML 文件。随后&#xff0c;浏览器开始解析 HTML 代码&#xff0c;将其转化为一系列的标签和文本&#xff0c;并构建出 DOM 树。这棵树以层次结构表示了网…

Tensorflow预训练模型转PyTorch

深度学习领域是计算机科学中变化最快的领域之一。大约 5 年前&#xff0c;当我开始研究这个主题时&#xff0c;TensorFlow 被认为是主导框架。如今&#xff0c;大多数研究人员已经转向 PyTorch。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/…

无人机无线电监测设备技术分析

随着无人机技术的飞速发展&#xff0c;其在民用、军事、科研及娱乐等领域的广泛应用&#xff0c;对无线电频谱资源的有效管理和监测提出了更高要求。无人机无线电监测设备作为保障空域安全、维护无线电秩序的重要工具&#xff0c;集成了高精度定位、频谱扫描、信号分析、数据处…

《Token-Label Alignment for Vision Transformers》ICCV2023

摘要 这篇论文探讨了数据混合策略&#xff08;例如CutMix&#xff09;在提高卷积神经网络&#xff08;CNNs&#xff09;性能方面的有效性&#xff0c;并指出这些策略在视觉Transformer&#xff08;ViTs&#xff09;上同样有效。然而&#xff0c;发现了一个“token fluctuation…

Axure RP界面设计初探:基础操作与实用技巧

Axure RP是目前流行的设计精美的用户界面和交互软件。Axure RP提供了一组丰富的RP。 UI 控件&#xff0c;这些控件根据它们的应用领域进行分类。作为Axure的国产替代品&#xff0c;它可以在线协同工作&#xff0c;浏览器可以在不下载客户端的情况下立即打开和使用。如果以前用A…

OpenCV专栏介绍

在当今人工智能和计算机视觉领域&#xff0c;OpenCV作为一个功能强大的开源库&#xff0c;已经成为实现各种视觉算法的基石。本“OpenCV”专栏致力于帮助读者深入理解并掌握OpenCV的使用&#xff0c;从而在计算机视觉项目中发挥关键作用。 专栏导读 随着技术的不断进步&#…

e6.利用 docker 快速部署自动化运维平台

利用 docker 快速部署自动化运维平台 1. 安装docker2. 拉取镜像3. 启动容器4. 初始化5. 访问测试 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主 机在线终端、文件在线上传下载、应用发布部署、在线任务计划、配置中…

Java程序员接单分享

作为一名Java程序员&#xff0c;这阵子通过承接些小型项目&#xff0c;我顺利跨过了月薪破万的门槛。这些项目虽小&#xff0c;却如同磨刀石般&#xff0c;让我在实战中发现了自身技术栈的棱角与不足&#xff0c;尤其是意识到了在Java这一浩瀚技术海洋中的诸多未知领域。我深知…

pytorch和deep learning技巧和bug解决方法短篇收集

有一些几句话就可以说明白的观点或者解决的的问题&#xff0c;小虎单独收集到这里。 torch.hub.load how does it work 下载预训练模型再载入&#xff0c;用程序下载链接可能失效。 model torch.hub.load(ultralytics/yolov5, yolov5s)model torch.hub.load(ultralytics/y…

WPF学习(10)-Label标签+TextBlock文字块+TextBox文本框+RichTextBox富文本框

Label标签 Label控件继承于ContentControl控件&#xff0c;它是一个文本标签&#xff0c;如果您想修改它的标签内容&#xff0c;请设置Content属性。我们曾提过ContentControl的Content属性是object类型&#xff0c;意味着Label的Content也是可以设置为任意的引用类型的。 案…

我的cesium for UE踩坑之旅(蓝图、UI创建)

我的小小历程 过程创建对应目录&#xff0c;并将要用到的图片、资源放入对应目录下内容浏览器 窗口中右键&#xff0c;创建一个控件蓝图&#xff0c;用来编辑界面UI绘制画布面板&#xff08;canvas&#xff09;调整整体布局加入对应的控件将UI加入到关卡中 备注搜索不到 Add To…

如何在Zoom中集成自己的app?一个简单的例子

一、注册zoom 账号、以便在zoom app maketplace创建app。 二、安装git、node.js、vscode开发环境&#xff08;略&#xff09;。 三、注册ngrok账号&#xff0c;获得一个免费的https静态域名。 四、配置zoom app(wxl)&#xff0c;设置上一步获得的https静态域名&#xff0c;验证…

进阶学习-----练习线程思维解决实际问题

线程在IT行业的实际应用 1. 多线程编程 在软件开发中&#xff0c;多线程编程是一种常见的技术&#xff0c;它允许程序同时执行多个任务。以下是多线程编程的一些具体应用&#xff1a; 任务分解&#xff1a;将一个大的任务分解为多个小任务&#xff0c;每个小任务由一个线程执…

C#基础——泛型

泛型 C# 中的泛型是一种强大的编程特性&#xff0c;它允许你编写类型安全且灵活的代码。泛型允许你定义类、结构体、接口、方法和委托&#xff0c;而不必在编译时指定具体的数据类型。相反&#xff0c;你可以使用类型参数来定义泛型类型或方法&#xff0c;然后在使用时指定具体…

springboot高校实验室安全管理系统-计算机毕业设计源码73839

目 录 摘要 1 绪论 1.1 研究背景 1.2 选题意义 1.3研究方案 1.4论文章节安排 2相关技术介绍 2.1 B/S结构 2.2 Spring Boot框架 2.3 Java语言 2.4 MySQL数据库 3系统分析 3.1 可行性分析 3.2 系统功能性分析 3.3.非功能性分析 3.4 系统用例分析 3.5系统流程分析…

算法板子:最短路问题——包含朴素Dijkstra算法、堆优化版的Dijkstra算法、SPFA算法、Floyd算法

目录 1. 几种算法的用途2. Dijkstra算法——求源点到其他所有点的最短路径(不能处理负边权)&#xff08;1&#xff09;朴素Dijkstra算法——适用于稠密图&#xff08;2&#xff09;堆优化版的Dijkstra算法——适用于稀疏图 4. SPFA算法——求源点到其他所有点的最短路径、判断是…

WordPress原创插件:disable-gutenberg禁用古腾堡编辑器和小工具

WordPress原创插件&#xff1a;disable-gutenberg禁用古腾堡编辑器和小工具 disable-gutenberg插件下载:https://download.csdn.net/download/huayula/89616495