Пересечение времени SQL
Имеется таблица с 3-мя столбцами id, start(timestamp with time zone), duration(interval). В этой таблице обозначены начало и продолжительность запланированных онлайн уроков. Проблема в том, что сервер не способен поддерживать более трех конференций одновременно. Нужен запрос, что бы определить какие трансляции или в какое время пересекаются, что бы заранее это отлавливать и переносить запланированные занятия. Например, при наличии трансляций в
- 15:00 на 45 минут
- 15:00 на 1 час
- 15:15 на 1 час 15 минут
- 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 шт):
Схематично:
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 - это точка перегрузки сервера.
