Вход | Регистрация
 

Объединение интервалов дат в запросе

Объединение интервалов дат в запросе
Я
   Amfiaray
 
11.01.16 - 17:31
Добрый день.
Есть записи регистра типа:
Оборудование   | Дата установки | Дата снятия
Оборудование 1 | 01.10.2015     | 10.10.2015
Оборудование 1 | 20.10.2015     | 31.10.2015
Оборудование 1 | 15.10.2015     | 25.10.2015

В итоге должно получиться:
Оборудование 1 | 01.10.2015     | 10.10.2015
Оборудование 1 | 15.10.2015     | 31.10.2015

Возможно такое сделать запросом или придется выборку обходить в коде?
   salvator
 
1 - 11.01.16 - 17:32
По какому принципу конечный результат получается?
   Futarkh
 
2 - 11.01.16 - 17:35
(1) Если периоды пересекаются, то их надо объединить
   Futarkh
 
3 - 11.01.16 - 17:38
(0) Думать в сторону Левого Соединения с условием
ДатаСнятия2 > ДатаУстановки1 и ДатаСнятия2 < ДатаУстановки1
   Futarkh
 
4 - 11.01.16 - 17:39
(0) Думать в сторону Левого Соединения с условием 
ДатаСнятия2 > ДатаУстановки1 и ДатаСнятия2 < ДатаСнятия1
   Futarkh
 
5 - 11.01.16 - 17:39
+(4) и потом группировать
   Futarkh
 
6 - 11.01.16 - 17:41
+(4) Левое соединение регистра самого к себе
   itlikbez
 
7 - 11.01.16 - 17:54
(0) Можно и запросом. Запросом вообще все можно. Но лучше обрабатывать в выборке. Для этой задачи императивный подход лучше декларативного.
   itlikbez
 
8 - 11.01.16 - 18:06
1. Левое соединение по условию
(ДатаУстановки2 >= ДатаУстановки1 И ДатаУстановки2 <= ДатаСнятия1)
ИЛИ
(ДатаУстановки1 >= ДатаУстановки2 И ДатаУстановки1 <= ДатаСнятия2)
2. Заменить NULL на даты-корреспонденты (ЕСТЬNULL()).
3. Выбрать (ВЫБОР... КОГДА) MIN для дат установки, и MAX для дат снятия.
4. Сгруппировать.
   itlikbez
 
9 - 11.01.16 - 18:07
(8) п.1 надо проверить, написал навскидку, будет работать для твоего примера.
   Ildarovich
 
10 - 11.01.16 - 18:37
Вот в этой статье http://catalog.mista.ru/public/306536/ есть пример 14 "Сжатое представление последовательности дат запросом", где показано, как отдельные даты объединить в интервал. Получается, что нужно "развернуть" все интервалы в набор дат интервала, затем сгруппировать (чтобы убрать "перекрытия"), а затем объединить запросом из примера 14.

Развернуть интервалы можно соединением с производствеенным календарем, например, или с искусственной таблицей, построенной, например, как в статье http://catalog.mista.ru/public/90367/ .

В обсуждении Непрерывные интервалы в запросе с нюансом в комментарии /8/ приведено решение для объединения интервалов, но оно работает только для не пересекающихся интервалов.

А вообще задача не простая. Решение (8) может не работать для случая, когда пересекаются (стыкуются) больше двух интервалов.

Для себя добавлю, что для максимальной скорости решения этой задачи (без тэта-соединений), нужно выбрать множество дней, не входящих не в какие интервалы, а затем  способом из http://catalog.mista.ru/public/402534/ найти интервалы между пропусками. Тогда будет предельно быстро.

Список тем форума
Рекламное место пустует  Рекламное место пустует
Здесь во втором сообщении вам дадут решение, а в двадцатом дадут правильное решение. Ymryn
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.