Определить элементарные интервалы, образующиеся при пересечении всех исходных интервалов

FastCode 63 8

Есть таблица ГрафикПоКалендарю с колонками От, До, ТипВремени и таблица Загрузка с колонками От, До, Работа. Требуется объединить эти таблицу в одну.

Принцип решения в том, чтобы все моменты времени (все начала, концы интервалов, 0, 24) собрать без повторений в одну таблицу, затем по этой таблице построить все самые мелкие интервалы, а к ним уже присоединять включающие их интервалы работ, рабочего времени и тому подобное. Такой принцип будет работать и для больше чем двух таблиц пересекающихся интервалов.

ВЫБРАТЬ
    0 КАК Момент
ПОМЕСТИТЬ ОсьВремени

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    График.От
ИЗ
    ГрафикПоКалендарю КАК График

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    График.До
ИЗ
    ГрафикПоКалендарю КАК График

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Загрузка.От
ИЗ
    Загрузка КАК Загрузка

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    Загрузка.До
ИЗ
    Загрузка КАК Загрузка

ОБЪЕДИНИТЬ

ВЫБРАТЬ
    24
;
ВЫБРАТЬ
    ОсьВремени.Момент КАК От,
    МИНИМУМ(Позже.Момент) КАК До
ПОМЕСТИТЬ ВсеИнтервалы
ИЗ
    ОсьВремени КАК ОсьВремени
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ОсьВремени КАК Позже
        ПО ОсьВремени.Момент < Позже.Момент
СГРУППИРОВАТЬ ПО
    ОсьВремени.Момент
;
ВЫБРАТЬ
    ВсеИнтервалы.От,
    ВсеИнтервалы.До,
    ЕСТЬNULL(ГрафикПоКалендарю.ТипВремени, "нераб. время") КАК ТипВремени,
    ЕСТЬNULL(Загрузка.Работа, "без работы") КАК Работа
ИЗ
    ВсеИнтервалы КАК ВсеИнтервалы
        ЛЕВОЕ СОЕДИНЕНИЕ ГрафикПоКалендарю КАК ГрафикПоКалендарю
        ПО (ГрафикПоКалендарю.От <= ВсеИнтервалы.От)
            И ВсеИнтервалы.До <= ГрафикПоКалендарю.До
        ЛЕВОЕ СОЕДИНЕНИЕ Загрузка КАК Загрузка
        ПО (Загрузка.От <= ВсеИнтервалы.От)
            И ВсеИнтервалы.До <= Загрузка.До

Проблема этого и всех приведенных запросов в том, что они будут сильно терять производительность при росте количества интервалов (если их станет больше нескольких тысяч).
С этим можно справится, применяя прием из статьи http://catalog.mista.ru/public/402534/ для определения интервалов и прием из статьи http://catalog.mista.ru/public/551583/ (или его упрощенную версию) для определения пересечения интервалов.

Автор: ildarovich

Орфографическая ошибка в нераб: нераб
OneTracker - трекер учета рабочего времени программиста 1С

Похожие публикации

Определение пересечения интервалов в кольце

Объединение непересекающихся интервалов в запросе

Модератору