Помогите составить запрос, значение параметра интервалами

1. evgensn 21.07.23 04:58 Сейчас в теме
Есть таблица

Дата | Значение параметра
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
По теме из базы знаний
Найденные решения
5. SlavaKron 21.07.23 08:59 Сейчас в теме
ВЫБРАТЬ
	ДАТАВРЕМЯ(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,
	ВТ_Границы.ЗначениеПараметра

УПОРЯДОЧИТЬ ПО
	ДатаНачала
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
3. RustamZz 21.07.23 08:53 Сейчас в теме
(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
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ДатыНачала.Событие,
	ДатыНачала.Начало,
	МИНИМУМ(ДатыОкончаний.Окончание) КАК Окончание
ИЗ
	ДатыНачала КАК ДатыНачала
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыОкончаний КАК ДатыОкончаний
		ПО ДатыНачала.Событие = ДатыОкончаний.Событие
			И ДатыНачала.Начало < ДатыОкончаний.Окончание

СГРУППИРОВАТЬ ПО
	ДатыНачала.Событие,
	ДатыНачала.Начало
Показать
Прикрепленные файлы:
Vitaly1C8; +1 Ответить
4. evgensn 21.07.23 08:58 Сейчас в теме
(3) Если период 2 года, например, такой запрос не подходит
7. RustamZz 21.07.23 09:24 Сейчас в теме
5. SlavaKron 21.07.23 08:59 Сейчас в теме
ВЫБРАТЬ
	ДАТАВРЕМЯ(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,
	ВТ_Границы.ЗначениеПараметра

УПОРЯДОЧИТЬ ПО
	ДатаНачала
Показать
8. evgensn 21.07.23 10:05 Сейчас в теме
(5) Был такой ответ уже
Если период 2 года, например, такой запрос не подходит
9. SlavaKron 21.07.23 10:20 Сейчас в теме
11. truba 21.07.23 10:33 Сейчас в теме
(9) Запрос хорош, но не обрабатывает прерывание периода.
Впрочем у ТС нет описание, как должно обрабатываться прерывание периода:

(0) Это два разных периода или один?
01.02.23 | 4
02.02.23 | 4
04.02.23 | 4
05.02.23 | 4
13. evgensn 21.07.23 10:43 Сейчас в теме
(9) чем хорош то запрос, проще тогда запрос с результатом сделать, вместо 1 будет 5 и все запрос не работает.

это 2 разных периода.
14. truba 21.07.23 10:45 Сейчас в теме
(13) Поясни что значит "вместо 1 будет 5" ?
16. evgensn 21.07.23 10:47 Сейчас в теме
(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

если бы периоды и параметры всегда были бы одинаковы, зачем мне запрос нужен был, и результат всегда одинаковый будет
18. truba 21.07.23 10:53 Сейчас в теме
(16) так вроде не проблема, эта таблица раскладывается этим запросом. Не пойму в чем загвоздка?
Запросы с соединением на разницу в один день обрабатывают прерывание периода, запросы с соединением по минимуму периода изменения параметра не обрабатывают, пока две концепции, третей еще не видно.

ПС. вопрос если первый столбец не дата, а любое значение, которое может быть упорядочено и для которого определен инкремент на единицу, вот с этим будут проблемы объективного характера.
22. truba 21.07.23 11:11 Сейчас в теме
(18) Впрочем они решаются соединением с таблицей "непрерывных пронумерованных значений эталонного периода" этого столбца, его само собой надо будет сгенерить.
К слову имея такую таблицу возникает кмк третья концепция решения.

ПС. Задача еще интереснее если в качестве значения может присутствовать NULL
23. evgensn 21.07.23 13:28 Сейчас в теме
(3) Не учитывает однодневный интервал
24. RustamZz 21.07.23 15:44 Сейчас в теме
(23) Внутреннее на Левое надо заменить и isnull'ом сделать дату окончания
2. truba 21.07.23 08:53 Сейчас в теме
А в периодах нет прерываний?
6. evgensn 21.07.23 08:59 Сейчас в теме
(2) Кстати да, период может прерываться,
т.е. например продолжение может быть таким
01.02.23 | 4
02.02.23 | 4
03.02.23 | 4
04.02.23 | 4
10. ImHunter 327 21.07.23 10:33 Сейчас в теме
(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. evgensn 21.07.23 10:40 Сейчас в теме
(9)
(7)
(10) вам деньги за это платят, что ли. Такой вариант уже был, зачем это городить, проще тогда результирующую таблицу сразу сделать.
А если период 2 года и значения параметров могут быть разные.
15. ImHunter 327 21.07.23 10:46 Сейчас в теме
(12) Фигасе, товарищ. Не хотите помощи - ну наср..ть тогда, сами думайте.
17. evgensn 21.07.23 10:50 Сейчас в теме
19. laperuz 47 21.07.23 11:00 Сейчас в теме
(12)Тут просто наполнение таблицы люди делают в запросе, чтобы понятнее было, достаточно заменить всю первую часть запроса на

ВЫБРАТЬ ТвояТаблица.Дата КАК Дата1, ТвояТаблица.ЗначениеПараметра КАК Знач1 ПОМЕСТИТЬ ВТ ИЗ &ТвояТаблица КАК ТвояТаблица


И дальше запрос.УстановитьПараметр("ТвояТаблица", ТвояТаблица)

И какую хочешь таблицу можно передавать, главное, чтобы было 2 колонки(Дата и ЗначениеПараметра), а сколько там строк - неважно.
20. evgensn 21.07.23 11:04 Сейчас в теме
(19) блин, да понял не сразу
21. spacecraft 21.07.23 11:04 Сейчас в теме
(19) если он этого не понял, то нет смысла что-то объяснять дальше - не поймет.
Оставьте свое сообщение

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