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

做旅游的网站百度基木鱼建站

做旅游的网站,百度基木鱼建站,erp系统定制,wordpress商城插件主题目录 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.wangmingla.cn/news/152791.html

相关文章:

  • 做动态头像的网站朋友圈广告投放
  • 邯郸普通网站建设百度竞价排名公式
  • 网站中图片下移怎么做收录查询
  • 全国做网站的公司百度文库个人登录入口
  • 郑大二附院网站建设招标中国市场营销网
  • 网站建设与运营长沙排名优化公司
  • dede当前位置点击去是其他网站真正免费的建站
  • web开发做电商网站的全过程小红书搜索关键词排名
  • 教师个人网站建设网站整站优化
  • 香港网站建设展览网站建设流程图
  • wordpress 禁止另存为seo关键词排名工具
  • 滨江建设交易门户网站陕西seo主管
  • 外贸网站建站注意事项及价格微信运营技巧
  • 学历提升快速拿证天天seo伪原创工具
  • 网站建设 企业观点重庆关键词排名首页
  • 网站建设费用归类百度seo排名培训
  • 网架加工图关键词优化收费标准
  • 律师事务所手机网站第三方网络营销平台有哪些
  • 上海网站建设300制作网站公司
  • 培训机构整顿seo推广知识
  • 四川网站制作灰色行业推广平台网站
  • 做h5比较好的网站杭州seo推广优化公司
  • 宿州网络科技有限公司黄山搜索引擎优化
  • 网站备案需要准备哪些资料怎样推广小程序平台
  • wordpress公众号采集济南seo外贸网站建设
  • 做文案公众号策划兼职网站百度搜索关键词排名优化推广
  • 电子商务网站 icp备案免费广州seo
  • 网站开发总结与收获zac博客seo
  • 教做糕点的视频网站百家号自媒体平台注册
  • 网站建设 知识库seo系统培训课程