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

FastCode 1534 13 21 67

Требуется объединить перекрывающиеся периоды. Например, шесть периодов 01.01.16 - 10.03.16; 01.02.16 - 20.03.16; 30.03.16 - 15.04.16; 10.04.16 - 12.04.16; 11.04.16 - 25.04.16; 30.04-16 - 10.05.16 должны объединиться в три 01.01.16 - 20.03.16; 30.03.16 - 25.04.16; 30.04-16 - 10.05.16

Автор: ildarovich

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Край.От
ПОМЕСТИТЬ ЛевыеКрая
ИЗ
    Интервалы КАК Край
        ЛЕВОЕ СОЕДИНЕНИЕ Интервалы КАК Интервалы
        ПО (Интервалы.От < Край.От)
            И Край.От <= Интервалы.До
ГДЕ
    Интервалы.От ЕСТЬ NULL 
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ РАЗЛИЧНЫЕ
    Край.До
ПОМЕСТИТЬ ПравыеКрая
ИЗ
    Интервалы КАК Край
        ЛЕВОЕ СОЕДИНЕНИЕ Интервалы КАК Интервалы
        ПО (Интервалы.От <= Край.До)
            И Край.До < Интервалы.До
ГДЕ
    Интервалы.От ЕСТЬ NULL 
;

////////////////////////////////////////////////////////////////////////////////

ВЫБРАТЬ
    ЛевыеКрая.От,
    МИНИМУМ(ПравыеКрая.До) КАК До
ИЗ
    ЛевыеКрая КАК ЛевыеКрая
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ПравыеКрая КАК ПравыеКрая
        ПО ЛевыеКрая.От <= ПравыеКрая.До

СГРУППИРОВАТЬ ПО
    ЛевыеКрая.От
0
{2} Ожидается идентификатор

См. также

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

Нахождение интервалов в запросе

Пересекаются ли два интервала

Получить даты за период в запросе

ПодключитьТестовыйПериод (БСП)

ПодключениеТестовыхПериодов_ПроверитьСостояниеЗапроса (БСП)

Инвертирование периодов в запросе

ПроверитьСостояниеЗапроса (БСП)

Разбиение произвольного периода на интервалы в запросе

Модератору