Помогите составить запрос, значение параметра интервалами
Есть таблица
Дата | Значение параметра
01.01.23 | 1
02.01.23 | 1
03.01.23 | 1
04.01.23 | 1
05.01.23 | 2
06.01.23 | 2
07.01.23 | 2
08.01.23 | 1
09.01.23 | 1
10.01.23 | 3
11.01.23 | 3
в результате нужно, таблицу со значениями параметра в интервале, просто с группировкй по значению параметра не получится, т.к. итервал значения параметра может прерываться
Дата Начала | Дата Окончания | Значение параметра
01.01.23 | 04.01.23 | 1
05.01.23 | 07.01.23 | 2
08.01.23 | 09.01.23 | 1
10.01.23 | 11.01.23 | 3
Дата | Значение параметра
01.01.23 | 1
02.01.23 | 1
03.01.23 | 1
04.01.23 | 1
05.01.23 | 2
06.01.23 | 2
07.01.23 | 2
08.01.23 | 1
09.01.23 | 1
10.01.23 | 3
11.01.23 | 3
в результате нужно, таблицу со значениями параметра в интервале, просто с группировкй по значению параметра не получится, т.к. итервал значения параметра может прерываться
Дата Начала | Дата Окончания | Значение параметра
01.01.23 | 04.01.23 | 1
05.01.23 | 07.01.23 | 2
08.01.23 | 09.01.23 | 1
10.01.23 | 11.01.23 | 3
По теме из базы знаний
- Минимализмы 3
- Универсальные функции ЗУП 3.1 / ЗКГУ 3.1, которые помогут в разработке
- Платформа интеграции 1С с чат-ботами (Telegram, Viber, WhatsApp, Instagram, Skype, ICQ, Facebook, ВКонтакте, Одноклассники, Яндекс.Алиса, Verbox, Jivochat, Avito)
- Начните уже использовать хранилище запросов
- 1С и СУБД Tantor: история одного внедрения
Найденные решения
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 1) КАК Дата,
1 КАК ЗначениеПараметра
ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 2),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 3),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 4),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 5),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 6),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 7),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 8),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 9),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 10),
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 11),
3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ.Дата КАК Дата,
ВТ.ЗначениеПараметра КАК ЗначениеПараметра
ПОМЕСТИТЬ ВТ1
ИЗ
ВТ КАК ВТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(МАКСИМУМ(ВТ.Дата), ДЕНЬ, 1),
НЕОПРЕДЕЛЕНО
ИЗ
ВТ КАК ВТ
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(ВложенныйЗапрос.Дата1) КАК Дата1,
ВложенныйЗапрос.Дата2 КАК Дата2,
ВложенныйЗапрос.ЗначениеПараметра КАК ЗначениеПараметра
ПОМЕСТИТЬ ВТ_Границы
ИЗ
(ВЫБРАТЬ
ВТ1.Дата КАК Дата1,
ВТ1.ЗначениеПараметра КАК ЗначениеПараметра,
МИНИМУМ(ВТ2.Дата) КАК Дата2
ИЗ
ВТ1 КАК ВТ1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ2
ПО ВТ1.Дата < ВТ2.Дата
И ВТ1.ЗначениеПараметра <> ВТ2.ЗначениеПараметра
СГРУППИРОВАТЬ ПО
ВТ1.Дата,
ВТ1.ЗначениеПараметра) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Дата2,
ВложенныйЗапрос.ЗначениеПараметра
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Границы.Дата1 КАК ДатаНачала,
ЕСТЬNULL(МАКСИМУМ(ВТ1.Дата), ВТ_Границы.Дата1) КАК ДатаОкончания,
ВТ_Границы.ЗначениеПараметра КАК ЗначениеПараметра
ИЗ
ВТ_Границы КАК ВТ_Границы
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ1
ПО ВТ_Границы.ЗначениеПараметра = ВТ1.ЗначениеПараметра
И ВТ_Границы.Дата1 < ВТ1.Дата
И ВТ_Границы.Дата2 > ВТ1.Дата
СГРУППИРОВАТЬ ПО
ВТ_Границы.Дата1,
ВТ_Границы.ЗначениеПараметра
УПОРЯДОЧИТЬ ПО
ДатаНачала
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(1)
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 1, 0, 0, 0) КАК ДатаСобытия,
1 КАК Событие
ПОМЕСТИТЬ НачТаблица
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 2, 0, 0, 0),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 3, 0, 0, 0),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 4, 0, 0, 0),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 5, 0, 0, 0),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 6, 0, 0, 0),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 7, 0, 0, 0),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 8, 0, 0, 0),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 9, 0, 0, 0),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 10, 0, 0, 0),
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 11, 0, 0, 0),
3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
НачТаблица.ДатаСобытия КАК Начало,
НачТаблица1.ДатаСобытия КАК Окончание,
НачТаблица.Событие
ПОМЕСТИТЬ ИсхТаблица
ИЗ
НачТаблица КАК НачТаблица
ВНУТРЕННЕЕ СОЕДИНЕНИЕ НачТаблица КАК НачТаблица1
ПО (ДОБАВИТЬКДАТЕ(НачТаблица.ДатаСобытия, ДЕНЬ, 1) = НачТаблица1.ДатаСобытия)
И НачТаблица.Событие = НачТаблица1.Событие
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсхТаблица.Событие,
ИсхТаблица.Начало
ПОМЕСТИТЬ ДатыНачала
ИЗ
ИсхТаблица КАК ИсхТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
ИсхТаблица2.Событие ЕСТЬ NULL
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсхТаблица.Событие,
ИсхТаблица.Окончание
ПОМЕСТИТЬ ДатыОкончаний
ИЗ
ИсхТаблица КАК ИсхТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
ПО ИсхТаблица.Окончание = ИсхТаблица2.Начало
И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
ИсхТаблица2.Событие ЕСТЬ NULL
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДатыНачала.Событие,
ДатыНачала.Начало,
МИНИМУМ(ДатыОкончаний.Окончание) КАК Окончание
ИЗ
ДатыНачала КАК ДатыНачала
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыОкончаний КАК ДатыОкончаний
ПО ДатыНачала.Событие = ДатыОкончаний.Событие
И ДатыНачала.Начало < ДатыОкончаний.Окончание
СГРУППИРОВАТЬ ПО
ДатыНачала.Событие,
ДатыНачала.Начало
ПоказатьПрикрепленные файлы:
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 1) КАК Дата,
1 КАК ЗначениеПараметра
ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 2),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 3),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 4),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 5),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 6),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 7),
2
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 8),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 9),
1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 10),
3
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДАТАВРЕМЯ(2023, 1, 11),
3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ.Дата КАК Дата,
ВТ.ЗначениеПараметра КАК ЗначениеПараметра
ПОМЕСТИТЬ ВТ1
ИЗ
ВТ КАК ВТ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(МАКСИМУМ(ВТ.Дата), ДЕНЬ, 1),
НЕОПРЕДЕЛЕНО
ИЗ
ВТ КАК ВТ
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
МИНИМУМ(ВложенныйЗапрос.Дата1) КАК Дата1,
ВложенныйЗапрос.Дата2 КАК Дата2,
ВложенныйЗапрос.ЗначениеПараметра КАК ЗначениеПараметра
ПОМЕСТИТЬ ВТ_Границы
ИЗ
(ВЫБРАТЬ
ВТ1.Дата КАК Дата1,
ВТ1.ЗначениеПараметра КАК ЗначениеПараметра,
МИНИМУМ(ВТ2.Дата) КАК Дата2
ИЗ
ВТ1 КАК ВТ1
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ2
ПО ВТ1.Дата < ВТ2.Дата
И ВТ1.ЗначениеПараметра <> ВТ2.ЗначениеПараметра
СГРУППИРОВАТЬ ПО
ВТ1.Дата,
ВТ1.ЗначениеПараметра) КАК ВложенныйЗапрос
СГРУППИРОВАТЬ ПО
ВложенныйЗапрос.Дата2,
ВложенныйЗапрос.ЗначениеПараметра
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ_Границы.Дата1 КАК ДатаНачала,
ЕСТЬNULL(МАКСИМУМ(ВТ1.Дата), ВТ_Границы.Дата1) КАК ДатаОкончания,
ВТ_Границы.ЗначениеПараметра КАК ЗначениеПараметра
ИЗ
ВТ_Границы КАК ВТ_Границы
ЛЕВОЕ СОЕДИНЕНИЕ ВТ1 КАК ВТ1
ПО ВТ_Границы.ЗначениеПараметра = ВТ1.ЗначениеПараметра
И ВТ_Границы.Дата1 < ВТ1.Дата
И ВТ_Границы.Дата2 > ВТ1.Дата
СГРУППИРОВАТЬ ПО
ВТ_Границы.Дата1,
ВТ_Границы.ЗначениеПараметра
УПОРЯДОЧИТЬ ПО
ДатаНачала
Показать
(14)
01.01.23 | 5
02.01.23 | 5
03.01.23 | 5
04.01.23 | 5
05.01.23 | 2
06.01.23 | 2
07.01.23 | 2
08.01.23 | 5
09.01.23 | 5
10.01.23 | 3
11.01.23 | 3
если бы периоды и параметры всегда были бы одинаковы, зачем мне запрос нужен был, и результат всегда одинаковый будет
01.01.23 | 5
02.01.23 | 5
03.01.23 | 5
04.01.23 | 5
05.01.23 | 2
06.01.23 | 2
07.01.23 | 2
08.01.23 | 5
09.01.23 | 5
10.01.23 | 3
11.01.23 | 3
если бы периоды и параметры всегда были бы одинаковы, зачем мне запрос нужен был, и результат всегда одинаковый будет
(16) так вроде не проблема, эта таблица раскладывается этим запросом. Не пойму в чем загвоздка?
Запросы с соединением на разницу в один день обрабатывают прерывание периода, запросы с соединением по минимуму периода изменения параметра не обрабатывают, пока две концепции, третей еще не видно.
ПС. вопрос если первый столбец не дата, а любое значение, которое может быть упорядочено и для которого определен инкремент на единицу, вот с этим будут проблемы объективного характера.
Запросы с соединением на разницу в один день обрабатывают прерывание периода, запросы с соединением по минимуму периода изменения параметра не обрабатывают, пока две концепции, третей еще не видно.
ПС. вопрос если первый столбец не дата, а любое значение, которое может быть упорядочено и для которого определен инкремент на единицу, вот с этим будут проблемы объективного характера.
(18) Впрочем они решаются соединением с таблицей "непрерывных пронумерованных значений эталонного периода" этого столбца, его само собой надо будет сгенерить.
К слову имея такую таблицу возникает кмк третья концепция решения.
ПС. Задача еще интереснее если в качестве значения может присутствовать NULL
К слову имея такую таблицу возникает кмк третья концепция решения.
ПС. Задача еще интереснее если в качестве значения может присутствовать NULL
(1) Ну так, на коленке написал. Вроде работает
ВЫБРАТЬ
&НачДата КАК Дата1,
1 КАК Знач1
ПОМЕСТИТЬ ВТ
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 1),
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 2),
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 3),
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 4),
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 5),
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 6),
2
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 7),
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 8),
1
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 9),
3
ОБЪЕДИНИТЬ
ВЫБРАТЬ
ДОБАВИТЬКДАТЕ(&НачДата, ДЕНЬ, 10),
3
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ.Дата1 КАК Дата1,
ВТ.Знач1 КАК Знач1
ПОМЕСТИТЬ ВТ_Окончания
ИЗ
ВТ КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1_пред
ПО (ВТ.Дата1 = ДОБАВИТЬКДАТЕ(ВТ1_пред.Дата1, ДЕНЬ, -1))
И ВТ.Знач1 = ВТ1_пред.Знач1
ГДЕ
ВТ1_пред.Дата1 ЕСТЬ NULL
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ВТ.Дата1 КАК Дата1,
ВТ.Знач1 КАК Знач1
ПОМЕСТИТЬ ВТ_Начала
ИЗ
ВТ КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ ВТ КАК ВТ1_пред
ПО (ВТ.Дата1 = ДОБАВИТЬКДАТЕ(ВТ1_пред.Дата1, ДЕНЬ, 1))
И ВТ.Знач1 = ВТ1_пред.Знач1
ГДЕ
ВТ1_пред.Дата1 ЕСТЬ NULL
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ различные
МАКСИМУМ(ВТ_Начала.Дата1) КАК ДатаНач,
минимум(ВТ_Окончания.Дата1) КАК ДатаКон,
ВТ.Знач1 КАК Знач1
ИЗ
ВТ КАК ВТ
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Начала КАК ВТ_Начала
ПО (ВТ_Начала.Дата1 <= ВТ.Дата1)
И ВТ.Знач1 = ВТ_Начала.Знач1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Окончания КАК ВТ_Окончания
ПО (ВТ_Окончания.Дата1 >= ВТ.Дата1)
И ВТ.Знач1 = ВТ_Окончания.Знач1
СГРУППИРОВАТЬ ПО
ВТ.Знач1, ВТ.Дата1
Показать
(12)Тут просто наполнение таблицы люди делают в запросе, чтобы понятнее было, достаточно заменить всю первую часть запроса на
И дальше запрос.УстановитьПараметр("ТвояТаблица", ТвояТаблица)
И какую хочешь таблицу можно передавать, главное, чтобы было 2 колонки(Дата и ЗначениеПараметра), а сколько там строк - неважно.
ВЫБРАТЬ ТвояТаблица.Дата КАК Дата1, ТвояТаблица.ЗначениеПараметра КАК Знач1 ПОМЕСТИТЬ ВТ ИЗ &ТвояТаблица КАК ТвояТаблица
И дальше запрос.УстановитьПараметр("ТвояТаблица", ТвояТаблица)
И какую хочешь таблицу можно передавать, главное, чтобы было 2 колонки(Дата и ЗначениеПараметра), а сколько там строк - неважно.
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот