"срез последних" без среза последних - выбрать периоды без виртуальной таблицы
Есть периодический РС, два измерения - производитель и видНоменклатуры. И ещё один ресурс.
Регистр соответственно определяет на каждый момент времени соответствие измерений этому ресурсу.
Требуется выбрать запросом, без виртуальной таблицы, данные в таком виде:
ДатаНачала | ДатаОкончания | Произв | Вид | Реквизит
Ну т.е. период действия каждого ресурса. Это вроде достаточно типовая задача, но что-то не соображу, как вычислить даты.
Т.е. например:
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 - ... - синий
Регистр соответственно определяет на каждый момент времени соответствие измерений этому ресурсу.
Требуется выбрать запросом, без виртуальной таблицы, данные в таком виде:
ДатаНачала | ДатаОкончания | Произв | Вид | Реквизит
Ну т.е. период действия каждого ресурса. Это вроде достаточно типовая задача, но что-то не соображу, как вычислить даты.
Т.е. например:
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 - ... - синий
По теме из базы знаний
- Заметки по SQL: Срез последних - аналог запроса
- Заметки по SQL: Запрос, получающий изменения ресурса в регистрах сведений по датам изменения за период
- Регистры накопления. Виртуальные таблицы. Часть №2: "Остатки" и "Остатки и обороты"
- Быстродействие типовой 1С
- Неочевидные возможности системы компоновки данных
Найденные решения
(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,
Данные.Производитель КАК Производитель,
Данные.ВидНоменклатуры КАК ВидНоменклатуры,
Данные.Цвет КАК Цвет
ИЗ
Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ ПериодыСледующие КАК ПериодыСледующие
ПО Данные.Период = ПериодыСледующие.Период
И Данные.Производитель = ПериодыСледующие.Производитель
И Данные.ВидНоменклатуры = ПериодыСледующие.ВидНоменклатуры
ПоказатьПрикрепленные файлы:

Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(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,
Данные.Производитель КАК Производитель,
Данные.ВидНоменклатуры КАК ВидНоменклатуры,
Данные.Цвет КАК Цвет
ИЗ
Данные КАК Данные
ЛЕВОЕ СОЕДИНЕНИЕ ПериодыСледующие КАК ПериодыСледующие
ПО Данные.Период = ПериодыСледующие.Период
И Данные.Производитель = ПериодыСледующие.Производитель
И Данные.ВидНоменклатуры = ПериодыСледующие.ВидНоменклатуры
ПоказатьПрикрепленные файлы:

Добрый вечер
P.S.
Не сразу увидел сообщение выше...
Суть в соединении таблицы с собой, но чтобы период у строки из другой таблицы был больше. С последующей группировкой и выбором минимального периода из подходящих.
ВЫБРАТЬ
Сведения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)
если, совсем не выводится последняя строка, то такое возможно только при внутреннем соединении.
Т.к. таблица одна и та же, то при левом соединении последняя строка регистра всегда должна присутствовать в результате)
В подтверждение прикрепил скриншот с данными и результатом запроса.
Только еще сортировку добавил по дате начала.
если, совсем не выводится последняя строка, то такое возможно только при внутреннем соединении.
Т.к. таблица одна и та же, то при левом соединении последняя строка регистра всегда должна присутствовать в результате)
В подтверждение прикрепил скриншот с данными и результатом запроса.
Только еще сортировку добавил по дате начала.
Прикрепленные файлы:

ВЫБРАТЬ
ДАТАВРЕМЯ(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)
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот