Коллеги, есть интересная задача. Дан массив временных непересекающихся интервалов (ДатаНачала, ДатаОкончания). Нужно в запросе слить в один интервал те, между которыми разрыв не более 2х минут. Слить соседние я могу. Слить даже через один - это сразу понятно (от текущего смежный снизу и сверху), но если у меня 28 интервалов с разрывом не более минуты, то тут нужен цикл...
Мысль вертится, что можно собрать разрывы с продолжительностью и ссылками на смежные интервалы, прилепить к первому интервалу и брать дату конца максимального интервала, пока не встретим разрыв более 2х минут. Как-то так.
Буду признателен за помощь.
Реализация нужна запросом.
Мысль вертится, что можно собрать разрывы с продолжительностью и ссылками на смежные интервалы, прилепить к первому интервалу и брать дату конца максимального интервала, пока не встретим разрыв более 2х минут. Как-то так.
Буду признателен за помощь.
Реализация нужна запросом.
По теме из базы знаний
- Баттерфляй - метод быстрого расчета нарастающего итога в запросе
- КонЗап - консоль запросов с улучшенным интерфейсом и дополнительными функциями
- Вычислить РАЗНОСТЬДАТ в рабочих днях
- Смотрим запросы 1С через Microsoft SQL Profiler по следам ошибок разработчиков, приводящих к проблемам производительности
- Объединение и исключение периодов в запросах
Найденные решения
Решение нашлось.
ВЫБРАТЬ
Геозоны.ДатаНачала КАК ДатаНачала,
Геозоны.ДатаОкончания КАК ДатаОкончания,
АВТОНОМЕРЗАПИСИ() КАК Порядок
ПОМЕСТИТЬ ВТГеозоны
ИЗ
&ТаблицаИнтервалов КАК Геозоны
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Геозоны1.Порядок КАК Порядок,
Геозоны1.ДатаНачала КАК ДатаНачала,
Геозоны2.ДатаНачала - Геозоны1.ДатаОкончания КАК Разрыв
ПОМЕСТИТЬ ВТРазрывы
ИЗ
ВТГеозоны КАК Геозоны1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТГеозоны КАК Геозоны2
ПО (Геозоны2.Порядок = Геозоны1.Порядок + 1)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Геозоны1.Порядок КАК Порядок,
ЕСТЬNULL(МИНИМУМ(Разрывы.Порядок), МАКСИМУМ(Геозоны2.Порядок)) КАК ВерхнийРазрыв
ПОМЕСТИТЬ ВТДопустимыеВерхниеРазрывы
ИЗ
ВТГеозоны КАК Геозоны1
ЛЕВОЕ СОЕДИНЕНИЕ ВТРазрывы КАК Разрывы
ПО (Разрывы.Порядок >= Геозоны1.Порядок)
И (Разрывы.Разрыв >= 120),
ВТГеозоны КАК Геозоны2
СГРУППИРОВАТЬ ПО
Геозоны1.Порядок
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(ВТГеозоны1.ДатаНачала) КАК ДатаНачала,
МАКСИМУМ(ВТГеозоны2.ДатаОкончания) КАК ДатаОкончания
ИЗ
ВТДопустимыеВерхниеРазрывы КАК ДопустимыеВерхниеРазрывы
ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны1
ПО (ВТГеозоны1.Порядок = ДопустимыеВерхниеРазрывы.Порядок)
ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны2
ПО (ВТГеозоны2.Порядок = ДопустимыеВерхниеРазрывы.ВерхнийРазрыв)
СГРУППИРОВАТЬ ПО
ДопустимыеВерхниеРазрывы.ВерхнийРазрыв
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Решение нашлось.
ВЫБРАТЬ
Геозоны.ДатаНачала КАК ДатаНачала,
Геозоны.ДатаОкончания КАК ДатаОкончания,
АВТОНОМЕРЗАПИСИ() КАК Порядок
ПОМЕСТИТЬ ВТГеозоны
ИЗ
&ТаблицаИнтервалов КАК Геозоны
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Геозоны1.Порядок КАК Порядок,
Геозоны1.ДатаНачала КАК ДатаНачала,
Геозоны2.ДатаНачала - Геозоны1.ДатаОкончания КАК Разрыв
ПОМЕСТИТЬ ВТРазрывы
ИЗ
ВТГеозоны КАК Геозоны1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТГеозоны КАК Геозоны2
ПО (Геозоны2.Порядок = Геозоны1.Порядок + 1)
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
Геозоны1.Порядок КАК Порядок,
ЕСТЬNULL(МИНИМУМ(Разрывы.Порядок), МАКСИМУМ(Геозоны2.Порядок)) КАК ВерхнийРазрыв
ПОМЕСТИТЬ ВТДопустимыеВерхниеРазрывы
ИЗ
ВТГеозоны КАК Геозоны1
ЛЕВОЕ СОЕДИНЕНИЕ ВТРазрывы КАК Разрывы
ПО (Разрывы.Порядок >= Геозоны1.Порядок)
И (Разрывы.Разрыв >= 120),
ВТГеозоны КАК Геозоны2
СГРУППИРОВАТЬ ПО
Геозоны1.Порядок
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(ВТГеозоны1.ДатаНачала) КАК ДатаНачала,
МАКСИМУМ(ВТГеозоны2.ДатаОкончания) КАК ДатаОкончания
ИЗ
ВТДопустимыеВерхниеРазрывы КАК ДопустимыеВерхниеРазрывы
ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны1
ПО (ВТГеозоны1.Порядок = ДопустимыеВерхниеРазрывы.Порядок)
ЛЕВОЕ СОЕДИНЕНИЕ ВТГеозоны КАК ВТГеозоны2
ПО (ВТГеозоны2.Порядок = ДопустимыеВерхниеРазрывы.ВерхнийРазрыв)
СГРУППИРОВАТЬ ПО
ДопустимыеВерхниеРазрывы.ВерхнийРазрыв
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот