Свернуть интервалы дат по неразрывному периоду
День добрый. Хочу свернуть поля периода в строки, при условии что конец текущего периода будет началом следующего в одно строку как интервал.
Строки таблицы:
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 Телефон
Строки таблицы:
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 Телефон
Найденные решения
(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
ПоказатьОстальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(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) Добрый день. С вашего позволения, немного изменил ваш запрос. Хотелось бы уточнить, вы делали внутренние соединения чтобы исключить из первых 2-х ВТ (даты начала и окончания) события, которые ограничиваются одной записью, а в последнем запросе их добавляете. А что если сделать так? Ткните носом если я что-то не учел...
ВЫБРАТЬ
ИсхТаблица.Событие,
ИсхТаблица.Начало,
ПОМЕСТИТЬ ДатыНачала
ИЗ
ИсхТаблица КАК ИсхТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
ПО ИсхТаблица.Начало = ИсхТаблица2.Окончание
И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
ИсхТаблица2.Событие ЕСТЬ NULL
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ИсхТаблица.Событие,
ИсхТаблица.Окончание
ПОМЕСТИТЬ ДатыОкончаний
ИЗ
ИсхТаблица КАК ИсхТаблица
ЛЕВОЕ СОЕДИНЕНИЕ ИсхТаблица КАК ИсхТаблица2
ПО ИсхТаблица.Окончание = ИсхТаблица2.Начало
И ИсхТаблица.Событие = ИсхТаблица2.Событие
ГДЕ
ИсхТаблица2.Событие ЕСТЬ NULL
;
//////////////////////////////////////////////////////////// ////////////////////
ВЫБРАТЬ
ДатыНачала.Событие,
ДатыНачала.Начало,
МИНИМУМ(ДатыОкончаний.Окончание) КАК Окончание
ИЗ
ДатыНачала КАК ДатыНачала
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ДатыОкончаний КАК ДатыОкончаний
ПО ДатыНачала.Событие = ДатыОкончаний.Событие
И ДатыНачала.Начало < ДатыОкончаний.Окончание
СГРУППИРОВАТЬ ПО
ДатыНачала.Событие,
ДатыНачала.Начало
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот