连续区间聚合SQL写法

求每个连续的相同状态的片段的开始及结束边界

postgresql:

with a as (
	select 0 hour_index,'启' state
	union all  select 1 hour_index,'停' state
	union all  select 2 hour_index,'停' state
	union all  select 3 hour_index,'启' state
	union all  select 4 hour_index,'启' state
	union all  select 5 hour_index,'启' state
	union all  select 6 hour_index,'停' state
	union all  select 7 hour_index,'启' state
	union all  select 8 hour_index,'停' state
	union all  select 9 hour_index,'停' state
	union all  select 10 hour_index,'启' state
	union all  select 11 hour_index,'启' state
),b as (
	SELECT hour_index,state,lag(state) over(order by hour_index) lag_state
	from a
),c as (
	select hour_index,state, lag_state, case when state=lag_state then 0 else 1 end is_first
	from b
),d as (
	select hour_index,state, lag_state,is_first
	from c
)
select *,sum(is_first) over( order by hour_index) group_id
from d
order by 1

结果:

hour_indexstatelag_stateis_firstgroup_id
0null11
112
202
313
403
503
614
715
816
906
1017
1107

这样就可以通过分组求 MIN()& MAX()得到起止位置了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值