Есть таблица ГрафикПоКалендарю с колонками От, До, ТипВремени и таблица Загрузка с колонками От, До, Работа. Требуется объединить эти таблицу в одну.
Принцип решения в том, чтобы все моменты времени (все начала, концы интервалов, 0, 24) собрать без повторений в одну таблицу, затем по этой таблице построить все самые мелкие интервалы, а к ним уже присоединять включающие их интервалы работ, рабочего времени и тому подобное. Такой принцип будет работать и для больше чем двух таблиц пересекающихся интервалов.
ВЫБРАТЬ
0 КАК Момент
ПОМЕСТИТЬ ОсьВремени
ОБЪЕДИНИТЬ
ВЫБРАТЬ
График.От
ИЗ
ГрафикПоКалендарю КАК График
ОБЪЕДИНИТЬ
ВЫБРАТЬ
График.До
ИЗ
ГрафикПоКалендарю КАК График
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Загрузка.От
ИЗ
Загрузка КАК Загрузка
ОБЪЕДИНИТЬ
ВЫБРАТЬ
Загрузка.До
ИЗ
Загрузка КАК Загрузка
ОБЪЕДИНИТЬ
ВЫБРАТЬ
24
;
ВЫБРАТЬ
ОсьВремени.Момент КАК От,
МИНИМУМ(Позже.Момент) КАК До
ПОМЕСТИТЬ ВсеИнтервалы
ИЗ
ОсьВремени КАК ОсьВремени
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОсьВремени КАК Позже
ПО ОсьВремени.Момент < Позже.Момент
СГРУППИРОВАТЬ ПО
ОсьВремени.Момент
;
ВЫБРАТЬ
ВсеИнтервалы.От,
ВсеИнтервалы.До,
ЕСТЬNULL(ГрафикПоКалендарю.ТипВремени, "нераб. время") КАК ТипВремени,
ЕСТЬNULL(Загрузка.Работа, "без работы") КАК Работа
ИЗ
ВсеИнтервалы КАК ВсеИнтервалы
ЛЕВОЕ СОЕДИНЕНИЕ ГрафикПоКалендарю КАК ГрафикПоКалендарю
ПО (ГрафикПоКалендарю.От <= ВсеИнтервалы.От)
И ВсеИнтервалы.До <= ГрафикПоКалендарю.До
ЛЕВОЕ СОЕДИНЕНИЕ Загрузка КАК Загрузка
ПО (Загрузка.От <= ВсеИнтервалы.От)
И ВсеИнтервалы.До <= Загрузка.До
Проблема этого и всех приведенных запросов в том, что они будут сильно терять производительность при росте количества интервалов (если их станет больше нескольких тысяч).
С этим можно справится, применяя прием из статьи http://catalog.mista.ru/public/402534/ для определения интервалов и прием из статьи http://catalog.mista.ru/public/551583/ (или его упрощенную версию) для определения пересечения интервалов.
Автор: ildarovich
Орфографическая ошибка в нераб: нераб
Определение пересечения интервалов в кольце
ПолучитьПредставленияЭлементарныхВопросовТабличногоВопроса (БСП)
Нахождение интервалов в запросе
ОбработчикиОбновленияВИнтервале (БСП)
Объединение непересекающихся интервалов в запросе
СоздатьФайловыйНачальныйОбразНаСервере (БСП)