SQLturning:定位连续值范围起点和终点

在上一篇blog说到,如何去优化查询连续值范围,没看过的朋友,上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm=1001.2014.3001.5501)

那么今天来说说怎么将连续的数据合并,然后返回合并后的起止时间,实验数据构造代码看上篇blog即可,上篇blog链接[在此]。(https://blog.csdn.net/weixin_42575078/article/details/135067645?spm=1001.2014.3001.5501)
比如前四个项目合并后,起止时间就是1号和5号。

select * from v;

SQLturning:定位连续值范围起点和终点_第1张图片
-----------------------------------------------接下来细分每个步骤写出这个SQL-----------------------------------------------
1、提取上一工程结束日期

select proj_id as 编号,
       proj_start as 开始时间,
       proj_end as 结束时间,
       lag(proj_end) over(order by proj_id) as 上一工程结束时间
  from v;

SQLturning:定位连续值范围起点和终点_第2张图片
2、标记工程的连续状态

with x0 as(
select proj_id as 编号,proj_start as 开始时间,proj_end as 结束时间,lag(proj_end) over(order by proj_id) as 上一工程结束时间
from v)
select 编号,开始时间,结束时间,上一工程结束时间,case when 开始时间 = 上一工程结束时间 then 0 else 1 end as 连续状态
from x0;

SQLturning:定位连续值范围起点和终点_第3张图片
3、将连续状态进行累加,得到分组依据

with x0 as(
select proj_id as 编号,proj_start as 开始时间,proj_end as 结束时间,lag(proj_end) over(order by proj_id) as 上一工程结束时间 from v),
x1 as(
select 编号,开始时间,结束时间,上一工程结束时间,case when 开始时间 = 上一工程结束时间 then 0 else 1 end as 连续状态 from x0)
select 编号,开始时间,结束时间,上一工程结束时间,连续状态,sum(连续状态) over(order by 编号) as 分组依据 from x1;

SQLturning:定位连续值范围起点和终点_第4张图片
4、根据分组依据即可统计出5个连续分组,并求出起止时间

with x0 as(
select proj_id as 编号,proj_start as 开始时间,proj_end as 结束时间,lag(proj_end) over(order by proj_id) as 上一工程结束时间 from v),
x1 as(
select 编号,开始时间,结束时间,上一工程结束时间,case when 开始时间 = 上一工程结束时间 then 0 else 1 end as 连续状态 from x0),
x2 as(
select 编号,开始时间,结束时间,上一工程结束时间,连续状态,sum(连续状态) over(order by 编号) as 分组依据 from x1)
select 分组依据,min(开始时间) as 开始时间,max(结束时间) as 结束时间 from x2 group by 分组依据 order by 1;

在这里插入图片描述
今天的要点就是善用分析函数lag() over(),感兴趣的朋友可以去做下实验。

你可能感兴趣的:(SQL,Turning,数据库,dba,mysql,数据库开发,oracle)