create function grp_sfunc(integer[],integer) returns integer[] language sql as $$
select array[$1[1]+($1[2] is distinct from $2 or $1[3]=0)::integer,$2,1];
$$;
✓
hidden batch(es)
create function grp_finalfunc(integer[]) returns integer language sql as $$
select $1[1];
$$;
select min(foo_at) begin_at, max(foo_at) end_at, foo_type
from (select *, grp(foo_type) over (order by foo_at) from foo) z
group by grp, foo_type
order by 1;