--ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ΅ Π·Π°Π΄Π°Π½ΠΈΠ΅
create table tmp_table1 (id int);
insert into tmp_table1 values(1),(2),(3),(6),(8),(9),(10),(11),(12),(14),(15),(16);
select min(id) as _start, max(id) as _end
from
(select id, id-row_number()over(order by id) as gr
from tmp_table1) as M
group by gr
order by 1;
---ΠΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ΅Π½ Π²Π°ΡΠΈΠ°Π½Ρ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π½Π°ΠΉΡΠΈ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»Ρ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ (ΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π°Π΄ Π½ΠΈΠΌΠΈ ΠΌΠ°Ρ. ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ):
create table tmp_table2 (id serial primary key, txt varchar(3));
insert into tmp_table2(txt) values('aa'),('ab'),('ac'),(''),(null),('ad'),('ac'),(''),('aa'),('as'),('ab'),('');
--Π² ΡΠ΅ΠΊΡΡΡΠΈΠΈ, ΠΏΠΎ ΡΡΡΠΈ, Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠΈΠΊΠ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ Π³ΡΡΠΏΠΏΡ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠ²
with RECURSIVE tt as (
select id, txt, 1 as gr
from tmp_table2 t1
where id=1
union all
select t1.id, t1.txt, case when ifnull(t1.txt,'')<>'' then tt.gr else tt.gr+1 end as gr
from tmp_table2 t1
inner join tt
on tt.id+1=t1.id
)
select distinct gr,
first_value(txt)over(partition by gr order by gr) _start,
last_value(txt)over(partition by gr order by gr) _end from tt
where isnull(txt,'')<>''
order by 1;
--Π΅ΡΠ»ΠΈ ΡΠ±ΡΠ°ΡΡ Π³ΡΡΠΏΠΏΡ id2 ΠΈΠ· Π²ΡΠ±ΠΎΡΠΊΠΈ, ΡΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΠ»Π΅ΡΠ°Π΅Ρ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ°, Π½ΠΎ Π½Π°ΡΠ°Π»ΠΎ ΠΈ ΠΊΠΎΠ½Π΅Ρ ΠΈΠ½ΡΠ΅ΡΠ²Π°Π»ΠΎΠ² ΡΠΎΡ ΡΠ°Π½ΡΡΡΡ.