1) решение плотной_ранки:
with tbl_with_group as (
select
t.*,
dense_rank() over(partition BY id order BY date_from) - dense_rank() OVER(partition BY id, param1, param2 order by date_from) group_number
from
table t
)
select
id, min(date_from), max(date_to), param1, param2
from
tbl_with_group
group by
id, group_number, param1, param2
2) решение с задержкой:
with tbl_with_delimiter as (
select
t.*,
case when
lag(param1) over(partition by id order by date_from) = param1 and
lag(param2) over(partition by id order by date_from) = param2
then 0 else 1 end is_new_group_start
from
table t
),
tbl_with_group as (
select
t.*,
sum(is_new_group_start) over(partition by id order by date_from) group_number
from
tbl_with_delimiter t
)
select
id, min(date_from), max(date_to), param1, param2
from
tbl_with_group
group by
id, group_number, param1, param2
order by
id, group_number