"срез последних" без среза последних - выбрать периоды без виртуальной таблицы

1. vechiy 35 05.03.23 19:46 Сейчас в теме
Есть периодический РС, два измерения - производитель и видНоменклатуры. И ещё один ресурс.
Регистр соответственно определяет на каждый момент времени соответствие измерений этому ресурсу.
Требуется выбрать запросом, без виртуальной таблицы, данные в таком виде:

ДатаНачала | ДатаОкончания | Произв | Вид | Реквизит

Ну т.е. период действия каждого ресурса. Это вроде достаточно типовая задача, но что-то не соображу, как вычислить даты.
Т.е. например:
1 апреля 20:00 - красный
2 апреля 15:00 - желтый
3 апреля 13:00 - красный
3 апреля 18:00 - синий

должно быть:
01.04 20:00 - 02.04 14:59:59 - красный
02.04 15:00 - 03.04 12:59:59 - желтый
03.04 13:00 - 03.04 17:59:59 - красный
03.04 18:00 - ... - синий
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
2. echo77 1919 05.03.23 21:06 Сейчас в теме +3 $m
(1) Примерно таким запросом
ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 1) КАК Период,
    "П1" КАК Производитель,
    "В1" КАК ВидНоменклатуры,
    "красный" КАК Цвет
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 2),
    "П1",
    "В1",
    "желтый"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 3),
    "П1",
    "В1",
    "красный"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 4),
    "П1",
    "В1",
    "синий"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Данные.Период КАК Период,
    Данные.Производитель КАК Производитель,
    Данные.ВидНоменклатуры КАК ВидНоменклатуры,
    МИНИМУМ(Данные1.Период) КАК ПериодСледующий
ПОМЕСТИТЬ ПериодыСледующие
ИЗ
    Данные КАК Данные
        ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные1
        ПО Данные.Производитель = Данные1.Производитель
            И Данные.ВидНоменклатуры = Данные1.ВидНоменклатуры
            И Данные.Период < Данные1.Период

СГРУППИРОВАТЬ ПО
    Данные.Период,
    Данные.Производитель,
    Данные.ВидНоменклатуры
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Данные.Период КАК Период1,
    ВЫБОР
        КОГДА ПериодыСледующие.ПериодСледующий ЕСТЬ НЕ NULL 
            ТОГДА ДОБАВИТЬКДАТЕ(ПериодыСледующие.ПериодСледующий, СЕКУНДА, -1)
        ИНАЧЕ NULL
    КОНЕЦ КАК Период2,
    Данные.Производитель КАК Производитель,
    Данные.ВидНоменклатуры КАК ВидНоменклатуры,
    Данные.Цвет КАК Цвет
ИЗ
    Данные КАК Данные
        ЛЕВОЕ СОЕДИНЕНИЕ ПериодыСледующие КАК ПериодыСледующие
        ПО Данные.Период = ПериодыСледующие.Период
            И Данные.Производитель = ПериодыСледующие.Производитель
            И Данные.ВидНоменклатуры = ПериодыСледующие.ВидНоменклатуры
Показать
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. echo77 1919 05.03.23 21:06 Сейчас в теме +3 $m
(1) Примерно таким запросом
ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 1) КАК Период,
    "П1" КАК Производитель,
    "В1" КАК ВидНоменклатуры,
    "красный" КАК Цвет
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 2),
    "П1",
    "В1",
    "желтый"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 3),
    "П1",
    "В1",
    "красный"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 4),
    "П1",
    "В1",
    "синий"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Данные.Период КАК Период,
    Данные.Производитель КАК Производитель,
    Данные.ВидНоменклатуры КАК ВидНоменклатуры,
    МИНИМУМ(Данные1.Период) КАК ПериодСледующий
ПОМЕСТИТЬ ПериодыСледующие
ИЗ
    Данные КАК Данные
        ЛЕВОЕ СОЕДИНЕНИЕ Данные КАК Данные1
        ПО Данные.Производитель = Данные1.Производитель
            И Данные.ВидНоменклатуры = Данные1.ВидНоменклатуры
            И Данные.Период < Данные1.Период

СГРУППИРОВАТЬ ПО
    Данные.Период,
    Данные.Производитель,
    Данные.ВидНоменклатуры
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    Данные.Период КАК Период1,
    ВЫБОР
        КОГДА ПериодыСледующие.ПериодСледующий ЕСТЬ НЕ NULL 
            ТОГДА ДОБАВИТЬКДАТЕ(ПериодыСледующие.ПериодСледующий, СЕКУНДА, -1)
        ИНАЧЕ NULL
    КОНЕЦ КАК Период2,
    Данные.Производитель КАК Производитель,
    Данные.ВидНоменклатуры КАК ВидНоменклатуры,
    Данные.Цвет КАК Цвет
ИЗ
    Данные КАК Данные
        ЛЕВОЕ СОЕДИНЕНИЕ ПериодыСледующие КАК ПериодыСледующие
        ПО Данные.Период = ПериодыСледующие.Период
            И Данные.Производитель = ПериодыСледующие.Производитель
            И Данные.ВидНоменклатуры = ПериодыСледующие.ВидНоменклатуры
Показать
Прикрепленные файлы:
6. vechiy 35 06.03.23 14:15 Сейчас в теме
3. egorkinps 05.03.23 21:13 Сейчас в теме
Добрый вечер

ВЫБРАТЬ
    Сведения1.Период КАК ДатаНачала,
    МИНИМУМ(ЕСТЬNULL(ДОБАВИТЬКДАТЕ(Сведения2.Период, СЕКУНДА, -1), ДАТАВРЕМЯ(1, 1, 1, 0, 0, 0))) КАК ДатаОкончания,
    Сведения1.Производитель КАК Производитель,
    Сведения1.ВидНоменклатуры КАК ВидНоменклатуры,
    Сведения1.Ресурс КАК Ресурс
ИЗ
    РегистрСведений.СведенияОВидеНоменклатуры КАК Сведения1
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.СведенияОВидеНоменклатуры КАК Сведения2
        ПО Сведения1.Производитель = Сведения2.Производитель
            И Сведения1.ВидНоменклатуры = Сведения2.ВидНоменклатуры
            И Сведения1.Период < Сведения2.Период

СГРУППИРОВАТЬ ПО
    Сведения1.Период,
    Сведения1.Производитель,
    Сведения1.ВидНоменклатуры,
    Сведения1.Ресурс
Показать


P.S.
Не сразу увидел сообщение выше...
Суть в соединении таблицы с собой, но чтобы период у строки из другой таблицы был больше. С последующей группировкой и выбором минимального периода из подходящих.
4. vechiy 35 06.03.23 13:10 Сейчас в теме
(3)
в вашем варианте почему-то не выводит последнюю строку. Дату окончания для предыдущей из неё вычисляет, но саму строка не выводится.
7. egorkinps 06.03.23 14:52 Сейчас в теме
(4)
если, совсем не выводится последняя строка, то такое возможно только при внутреннем соединении.
Т.к. таблица одна и та же, то при левом соединении последняя строка регистра всегда должна присутствовать в результате)
В подтверждение прикрепил скриншот с данными и результатом запроса.
Только еще сортировку добавил по дате начала.
Прикрепленные файлы:
5. homer_ 79 06.03.23 14:12 Сейчас в теме
ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 4) КАК Период,
    "П1" КАК Производитель,
    "В1" КАК ВидНоменклатуры,
    "синий" КАК Цвет
ПОМЕСТИТЬ Данные

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 1),
    "П1",
    "В1",
    "красный"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 2),
    "П1",
    "В1",
    "желтый"

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ДАТАВРЕМЯ(2022, 4, 3),
    "П1",
    "В1",
    "красный"
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ ПЕРВЫЕ 999
    Данные.Период КАК Период,
    Данные.Производитель,
    Данные.ВидНоменклатуры,
    Данные.Цвет,
    АВТОНОМЕРЗАПИСИ() КАК Порядок
ПОМЕСТИТЬ м1
ИЗ
    Данные КАК Данные

УПОРЯДОЧИТЬ ПО
    Период
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
    м1.Период,
    м1.Производитель,
    м1.ВидНоменклатуры,
    м1.Цвет,
    м1.Порядок,
    м11.Период КАК Период1
ИЗ
    м1 КАК м1
        ЛЕВОЕ СОЕДИНЕНИЕ м1 КАК м11
        ПО (м1.Порядок = м11.Порядок -1)
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот