В следующей таблице: https://www.db-fiddle.com/f/avcRnMG6SVAoRuV5Rf4znF/2
create table tbl
(id integer,
start integer,
stop integer,
type integer);
INSERT INTO tbl values
(101, 1, 3, 10),
(101, 3, 6, 15),
(101, 6, 10, 17),
(101, 10, 40, 20),
(101, 40, 100, 20),
(101, 100, 200, 20),
(101, 200, 500, 55);
Я хочу сгруппировать соседние строки с одинаковым значением с граничными значениями start
и stop
. Таким образом, вместо 3 строк с type 20
в результатах должно быть
101, 10, 200, 20
Я пробовал что-то вроде этого, но это далеко не хорошо, есть ли какое-то умное, короткое решение?
SELECT
id,
case when lag(type) OVER (partition by id ORDER BY start ) = type
then lag(start) OVER (partition by id ORDER BY start) else start end as from
, case when lead(type) OVER (partition by id ORDER BY start ) = type
then lead(stop) OVER (partition by id ORDER BY start) else stop end as to
, type
from tbl