Свернуть интервалы дат по неразрывному периоду

1. jenikslove 11.02.23 11:33 Сейчас в теме
День добрый. Хочу свернуть поля периода в строки, при условии что конец текущего периода будет началом следующего в одно строку как интервал.
Строки таблицы:
01.10.2023 0:00 01.10.2023 1:00 Телефон
01.10.2023 1:00 01.10.2023 2:00 Телефон
01.10.2023 2:00 01.10.2023 3:00 Телефон
01.10.2023 4:00 01.10.2023 5:00 Телефон
01.10.2023 3:00 01.10.2023 4:00 Телефон
01.10.2023 5:10 01.10.2023 6:00 Интернет
01.10.2023 6:00 01.10.2023 7:00 Интернет
01.10.2023 7:01 01.10.2023 8:00 Общение
01.10.2023 8:00 01.10.2023 9:00 Интернет
01.10.2023 9:00 01.10.2023 10:00 Телефон
01.10.2023 10:00 01.10.2023 11:00 Телефон

Хочу получить:
01.10.2023 0:00 01.10.2023 5:00 Телефон
01.10.2023 5:10 01.10.2023 7:00 Интернет
01.10.2023 7:01 01.10.2023 8:00 Общение
01.10.2023 8:00 01.10.2023 9:00 Интернет
01.10.2023 9:00 01.10.2023 11:00 Телефон
Найденные решения
2. RustamZz 12.02.23 11:50 Сейчас в теме
(1)
ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Начало
ПОМЕСТИТЬ ДатыНачала
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица1
		ПО ИсхТаблица.Окончание = ИсхТаблица1.Начало
			И ИсхТаблица.Событие = ИсхТаблица1.Событие
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица2.Событие ЕСТЬ NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Окончание
ПОМЕСТИТЬ ДатыОкончаний
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица1
		ПО ИсхТаблица.Начало = ИсхТаблица1.Окончание
			И ИсхТаблица.Событие = ИсхТаблица1.Событие
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Окончание = ИсхТаблица2.Начало
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица2.Событие ЕСТЬ NULL
;

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

СГРУППИРОВАТЬ ПО
	ДатыНачала.Событие,
	ДатыНачала.Начало

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

ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Начало,
	ИсхТаблица.Окончание
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица1
		ПО ИсхТаблица.Окончание = ИсхТаблица1.Начало
			И ИсхТаблица.Событие = ИсхТаблица1.Событие
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица1.Событие ЕСТЬ NULL
	И ИсхТаблица2.Событие ЕСТЬ NULL
Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. RustamZz 12.02.23 11:50 Сейчас в теме
(1)
ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Начало
ПОМЕСТИТЬ ДатыНачала
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица1
		ПО ИсхТаблица.Окончание = ИсхТаблица1.Начало
			И ИсхТаблица.Событие = ИсхТаблица1.Событие
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица2.Событие ЕСТЬ NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Окончание
ПОМЕСТИТЬ ДатыОкончаний
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица1
		ПО ИсхТаблица.Начало = ИсхТаблица1.Окончание
			И ИсхТаблица.Событие = ИсхТаблица1.Событие
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Окончание = ИсхТаблица2.Начало
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица2.Событие ЕСТЬ NULL
;

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

СГРУППИРОВАТЬ ПО
	ДатыНачала.Событие,
	ДатыНачала.Начало

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

ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Начало,
	ИсхТаблица.Окончание
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица1
		ПО ИсхТаблица.Окончание = ИсхТаблица1.Начало
			И ИсхТаблица.Событие = ИсхТаблица1.Событие
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица1.Событие ЕСТЬ NULL
	И ИсхТаблица2.Событие ЕСТЬ NULL
Показать
3. Zevzm 14.02.23 12:50 Сейчас в теме
(2) Добрый день. С вашего позволения, немного изменил ваш запрос. Хотелось бы уточнить, вы делали внутренние соединения чтобы исключить из первых 2-х ВТ (даты начала и окончания) события, которые ограничиваются одной записью, а в последнем запросе их добавляете. А что если сделать так? Ткните носом если я что-то не учел...
ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Начало,
ПОМЕСТИТЬ ДатыНачала
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица2.Событие ЕСТЬ NULL
;

////////////////////////////////////////////////////////////­////////////////////
ВЫБРАТЬ
	ИсхТаблица.Событие,
	ИсхТаблица.Окончание
ПОМЕСТИТЬ ДатыОкончаний
ИЗ
	ИсхТаблица КАК ИсхТаблица
		ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
		ПО ИсхТаблица.Окончание = ИсхТаблица2.Начало
			И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
	ИсхТаблица2.Событие ЕСТЬ NULL
;

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

СГРУППИРОВАТЬ ПО
	ДатыНачала.Событие,
	ДатыНачала.Начало
Показать
4. RustamZz 14.02.23 13:58 Сейчас в теме
(3) Да возможно. Второй запрос в объединение добавил, когда отдельные события не попали в результат. Стоило потратить время и подумать, а я пошел по простому пути. Прастите.
5. Zevzm 14.02.23 14:00 Сейчас в теме
(4) Я учусь по вашему запросу, хотел понять вашу логику. Никаких претензий ))) Спасибо.
Оставьте свое сообщение

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