Слить интервалы в запросе

1. PLAstic 296 26.11.20 09:30 Сейчас в теме
Коллеги, есть интересная задача. Дан массив временных непересекающихся интервалов (ДатаНачала, ДатаОкончания). Нужно в запросе слить в один интервал те, между которыми разрыв не более 2х минут. Слить соседние я могу. Слить даже через один - это сразу понятно (от текущего смежный снизу и сверху), но если у меня 28 интервалов с разрывом не более минуты, то тут нужен цикл...
Мысль вертится, что можно собрать разрывы с продолжительностью и ссылками на смежные интервалы, прилепить к первому интервалу и брать дату конца максимального интервала, пока не встретим разрыв более 2х минут. Как-то так.
Буду признателен за помощь.
Реализация нужна запросом.
По теме из базы знаний
Найденные решения
6. PLAstic 296 26.11.20 10:25 Сейчас в теме
Решение нашлось.

ВЫБРАТЬ
	Геозоны.ДатаНачала КАК ДатаНачала,
	Геозоны.ДатаОкончания КАК ДатаОкончания,
	АВТОНОМЕРЗАПИСИ() КАК Порядок
ПОМЕСТИТЬ ВТГеозоны
ИЗ
	&ТаблицаИнтервалов КАК Геозоны
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Геозоны1.Порядок КАК Порядок,
	Геозоны1.ДатаНачала КАК ДатаНачала,
	Геозоны2.ДатаНачала - Геозоны1.ДатаОкончания КАК Разрыв
ПОМЕСТИТЬ ВТРазрывы
ИЗ
	ВТГеозоны КАК Геозоны1
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТГеозоны КАК Геозоны2
		ПО (Геозоны2.Порядок = Геозоны1.Порядок + 1)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Геозоны1.Порядок КАК Порядок,
	ЕСТЬNULL(МИНИМУМ(Разрывы.Порядок), МАКСИМУМ(Геозоны2.Порядок)) КАК ВерхнийРазрыв
ПОМЕСТИТЬ ВТДопустимыеВерхниеРазрывы
ИЗ
	ВТГеозоны КАК Геозоны1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТРазрывы КАК Разрывы
		ПО (Разрывы.Порядок >= Геозоны1.Порядок)
			И (Разрывы.Разрыв >= 120),
	ВТГеозоны КАК Геозоны2

СГРУППИРОВАТЬ ПО
	Геозоны1.Порядок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МИНИМУМ(ВТГеозоны1.ДатаНачала) КАК ДатаНачала,
	МАКСИМУМ(ВТГеозоны2.ДатаОкончания) КАК ДатаОкончания
ИЗ
	ВТДопустимыеВерхниеРазрывы КАК ДопустимыеВерхниеРазрывы
		ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны1
		ПО (ВТГеозоны1.Порядок = ДопустимыеВерхниеРазрывы.Порядок)
		ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны2
		ПО (ВТГеозоны2.Порядок = ДопустимыеВерхниеРазрывы.ВерхнийРазрыв)

СГРУППИРОВАТЬ ПО
	ДопустимыеВерхниеРазрывы.ВерхнийРазрыв
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
4. DmitriyTih 26.11.20 10:09 Сейчас в теме
(1)10 минут подумал, порисовал. Без использования цикла не получается(((. Но достаточно быстро решается, если в цикле слить интервалы и уже слитые передавать для дальнейших нужд в запрос.
2. Гарин 1 26.11.20 10:06 Сейчас в теме
Сначала сортируешь массив, далее в цикле начинаешь сливать по 2 соседних, повторяешь слияние пока не останется что сливать
3. PLAstic 296 26.11.20 10:07 Сейчас в теме
(2) Пардон, забыл обозначить в тексте. Это надо сделать в запросе.
5. DmitriyTih 26.11.20 10:12 Сейчас в теме
(3)так в названии темы написано "Слить интервалы в запросе". Задача предельно понятна)
6. PLAstic 296 26.11.20 10:25 Сейчас в теме
Решение нашлось.

ВЫБРАТЬ
	Геозоны.ДатаНачала КАК ДатаНачала,
	Геозоны.ДатаОкончания КАК ДатаОкончания,
	АВТОНОМЕРЗАПИСИ() КАК Порядок
ПОМЕСТИТЬ ВТГеозоны
ИЗ
	&ТаблицаИнтервалов КАК Геозоны
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Геозоны1.Порядок КАК Порядок,
	Геозоны1.ДатаНачала КАК ДатаНачала,
	Геозоны2.ДатаНачала - Геозоны1.ДатаОкончания КАК Разрыв
ПОМЕСТИТЬ ВТРазрывы
ИЗ
	ВТГеозоны КАК Геозоны1
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТГеозоны КАК Геозоны2
		ПО (Геозоны2.Порядок = Геозоны1.Порядок + 1)
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	Геозоны1.Порядок КАК Порядок,
	ЕСТЬNULL(МИНИМУМ(Разрывы.Порядок), МАКСИМУМ(Геозоны2.Порядок)) КАК ВерхнийРазрыв
ПОМЕСТИТЬ ВТДопустимыеВерхниеРазрывы
ИЗ
	ВТГеозоны КАК Геозоны1
		ЛЕВОЕ СОЕДИНЕНИЕ ВТРазрывы КАК Разрывы
		ПО (Разрывы.Порядок >= Геозоны1.Порядок)
			И (Разрывы.Разрыв >= 120),
	ВТГеозоны КАК Геозоны2

СГРУППИРОВАТЬ ПО
	Геозоны1.Порядок
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	МИНИМУМ(ВТГеозоны1.ДатаНачала) КАК ДатаНачала,
	МАКСИМУМ(ВТГеозоны2.ДатаОкончания) КАК ДатаОкончания
ИЗ
	ВТДопустимыеВерхниеРазрывы КАК ДопустимыеВерхниеРазрывы
		ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны1
		ПО (ВТГеозоны1.Порядок = ДопустимыеВерхниеРазрывы.Порядок)
		ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны2
		ПО (ВТГеозоны2.Порядок = ДопустимыеВерхниеРазрывы.ВерхнийРазрыв)

СГРУППИРОВАТЬ ПО
	ДопустимыеВерхниеРазрывы.ВерхнийРазрыв
Показать
7. PLAstic 296 26.11.20 14:20 Сейчас в теме
(6) Там пара неточностей была исправлена позже, но в целом запрос работает.
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот