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

FastCode 65 8

Задача заключается в том, чтобы собрать в один непрерывный интервал все время проживание гостя в гостинице, если между интервалами не было перерывов. То есть для таблицы
t1.png

Это делает следующий запрос, являющийся развитием идей решения задачи 14 из предыдущей статьи на случай интервалов:

ВЫБРАТЬ
    Дано.НачалоПериода,
    Дано.КонецПериода,
    Дано.Гостиница,
    Дано.ФизическоеЛицо,
    СУММА(РАЗНОСТЬДАТ(Слева.НачалоПериода, Слева.КонецПериода, ДЕНЬ) + 1) КАК Интеграл
ПОМЕСТИТЬ ДаноПлюс
ИЗ
    Дано КАК Дано
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ Дано КАК Слева
        ПО (Слева.НачалоПериода <= Дано.НачалоПериода) 
           И Дано.Гостиница = ДаноСлева.Гостиница 
           И Дано.ФизическоеЛицо = ДаноСлева.ФизическоеЛицо
СГРУППИРОВАТЬ ПО
    Дано.НачалоПериода,
    Дано.КонецПериода,
    Дано.Гостиница,
    Дано.ФизическоеЛицо
;
ВЫБРАТЬ
    МИНИМУМ(Дано.НачалоПериода) КАК НачалоПериода,
    МАКСИМУМ(Дано.КонецПериода) КАК КонецПериода,
    Дано.Гостиница,
    Дано.ФизическоеЛицо
ИЗ
    ДаноПлюс КАК Дано
СГРУППИРОВАТЬ ПО
    ДОБАВИТЬКДАТЕ(Дано.КонецПериода, ДЕНЬ, -Дано.Интеграл),
    Дано.Гостиница,
    Дано.ФизическоеЛицо

Автор: ildarovich

TurboConf - расширение Конфигуратора 1С

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

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

Объединение данных двух периодических регистров

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

Сжатое представление последовательности дат запросом

Получение интервалов неизменности курсов валют

Модератору