Bạn có thể gán một số nhận dạng nhóm cho các bản ghi. Ý tưởng là tìm các bản ghi không trùng lặp và sử dụng chúng như phần đầu của một nhóm.
Phần sau chỉ định các nhóm cho mỗi bản ghi:
select t.*, sum(group_start) over (order by dstart) as grp
from (select t.*,
(case when not exists (select 1
from t t2
where t2.dstart < t.dstart and t2.dend >= t.dstart
)
then 1 else 0
end) group_start
from t
) t
Nếu bạn chỉ muốn các nhóm cho một bản ghi nhất định thì có một số cách, chẳng hạn như:
with overlaps as (
<query above>
)
select o.*
from overlaps o
where o.grp = (select o2.grp from overlaps o2 where o2.id = ???);