Вы можете определить промежутки и начала и остановки. Чтобы определить пропуски, подсчитайте количество непропусков и агрегируйте:
select min(he), max(he), count(*) as size
from (select t.*, count(name) over (order by he) as grp
from t
) t
where name is null
group by grp;
Затем можно отфильтровать, используя having
для пропусков определенного размера, скажем 2
:
having count(*) >= 2
Например,
.
Суммирует пропуски, по одному на строку. Это на самом деле кажется мне более полезным, чем отдельная строка для каждой строки.
РЕДАКТИРОВАТЬ:
Если вы действительно хотели исходные строки, вы можете сделать:
select t.*
from (select t.*,
max(he) filter (where name is not null) over (order by he) as prev_he,
min(he) filter (where name is not null) over (order by he desc) as next_he,
max(he) over () as max_he
from t
) t
where name is null and
(max(next_he, max_he + 1) - coalesce(prev_he, 0) - 1) >= 2;
РЕДАКТИРОВАТЬ II:
В более старых версиях MySQL / MariaDB вы можете использовать переменные:
select min(he), max(he), count(*) as size
from (select t.*,
(@grp := @grp + (name is not null)) as grp
from (select t.* from t order by he) t cross join
(select @grp := 0) params
) t
where name is null
group by grp;