Пересечение времени SQL

Имеется таблица с 3-мя столбцами id, start(timestamp with time zone), duration(interval). В этой таблице обозначены начало и продолжительность запланированных онлайн уроков. Проблема в том, что сервер не способен поддерживать более трех конференций одновременно. Нужен запрос, что бы определить какие трансляции или в какое время пересекаются, что бы заранее это отлавливать и переносить запланированные занятия. Например, при наличии трансляций в

  1. 15:00 на 45 минут
  2. 15:00 на 1 час
  3. 15:15 на 1 час 15 минут
  4. 15:30 на 45 минут

видим пересечение, которое не "вытянет" наш сервер, запрос должен найти это, и выдать, например, "косячный" интервал или id этих уроков. Реально ли это решить в SQL (postgres), или придется через Python?

create table lessons 
(id bigserial not null constraint str_pkey primary key, duration interval, sch_at timestamp with time zone)
insert into lessons
 (id, sch_at, duration) values 
(1234, '2020-09-19 15:30:00.000000', '0 years 0 mons 0 days 1 hours 15 mins 0.00 secs'), 
(1235, '2020-09-19 15:45:00.000000', '0 years 0 mons 0 days 0 hours 45 mins 0.00 secs');

Спасибо! введите сюда описание изображения


Ответы (1 шт):

Автор решения: Akina

Схематично:

WITH
cte1 AS ( SELECT time tt, time+duration td FROM table ),
cte2 AS ( SELECT tt, 1 w FROM cte1 UNION ALL SELECT td, -1 FROM cte1 )
SELECT DISTINCT tt, SUM(w) OVER (ORDER BY tt) ww FROM cte2;

Первая же четвёрка или более в ww - это точка перегрузки сервера.

→ Ссылка