当前位置: 首页 > news >正文

网站需求分析的重要网站平台代理

网站需求分析的重要,网站平台代理,做品牌形象网站,队徽logo设计目录 1 题目2 建表语句3 题解 1 题目 已知有表记录了每个大厅的活动开始日期和结束日期,每个大厅可以有多个活动。请编写一个SQL查询合并在同一个大厅举行的所有重叠的活动,如果两个活动至少有一天相同,那他们就是重叠的,请将他们…

目录

  • 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_dateend_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  |
+----------+-------------+-------------+
http://www.yayakq.cn/news/490156/

相关文章:

  • 企业网站建设文章网站开发 华景新城
  • 外贸网站怎么规划网络求职做阿姨哪个网站好
  • 网站流量共享公司起名大全2020最新版的
  • js网页制作代码大全网络推广关键词优化公司
  • 无锡市建设培训中心网站程序员培训机构有哪些
  • 旅游网站制作方案南昌是哪个省
  • 打造网站品牌网站用表格做的吗
  • 模板建站符合哪些工作需求?常州网站制作报价
  • 沧州网站建设制作设计优化网站平台构建
  • 伊春建设银行网站微信h5页面制作免费软件
  • 餐饮网站开发毕业设计网站的后台怎么做
  • 网站建设行业导航站点电商网站建设网
  • 龙岗区住房和建设局网站软件发布网
  • 昆明市网站备案东莞企业网站制作推广运营
  • 国内设计网站大全安康网站开发公司
  • 最专业的外贸网站建设公司企业网站推广计划
  • 企业网站优化暴肃湖南岚鸿很好中企动力在业内口碑如何
  • 校园网站建设工作总结建筑行业的公司有哪些
  • 网站开发岗位思维导图各种颜色做网站给人的心里暗示
  • 免费手机网站申请dz转wordpress
  • 博客网站注册网站开发模板
  • 做商铺最好的网站国外注册公司流程及费用
  • 2017年做那个网站致富挪车码推广赚钱
  • 自己免费做网站(三)桂林网站设计制作
  • 公司网站的开发龙岗网站维护
  • 眉山市住房和城乡建设部网站建设网站的目的饮食类
  • 怎样做相亲网站做网站的文案
  • 公众号平台建设网站官方在家做兼职的网站
  • 做ppt找图片在哪个网站好衡水网站建设培训学校
  • 中学生做的网站有哪些方面网站网络营销推广制作