一种方法是行号的差异方法来获取每个序列:
select pid, count(*) as in_a_row, sum(val1_dur) as dur
from (select t.*,
row_number() over (partition by pid order by idx) as seqnum,
row_number() over (partition by pid, val3_bool order by idx) as seqnum_d
from consecutive t
) t
group by (seqnun - seqnum_d), pid, val3_bool;
如果您专门寻找“1”值,则将where val3_bool = 1 添加到外部查询中。为了理解为什么会这样,我建议你盯着子查询的结果,这样你就可以理解为什么差异定义了连续的值。
然后您可以使用distinct on 获得最大值:
select distinct on (pid) t.*
from (select pid, count(*) as in_a_row, sum(val1_dur) as dur
from (select t.*,
row_number() over (partition by pid order by idx) as seqnum,
row_number() over (partition by pid, val3_bool order by idx) as seqnum_d
from consecutive t
) t
group by (seqnun - seqnum_d), pid, val3_bool;
) t
order by pid, in_a_row desc;
distinct on 不需要额外的子查询级别,但我认为这使逻辑更清晰。