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