Пересечение периодов в запросе. #785898


#0 by qwasqu
Здравствуйте. Есть таблица, например: 01.01.16 - 10.03.16 В результате они должны схлопнуться в: Вообще таблица может быть какой угодно. Я не нашел способа в запросе схлопнуть ее. Подскажите, если кто сталкивался. Спасибо.
#1 by Злопчинский
задача определения пересечения периодов подробно рассмотрена на ИС у Ильдаровича - посмотри там, может найдешь полезное
#2 by qwasqu
К сожалению у него не то, там он выбирает периоды, которые содержат дату. ГДЕ &МоментВремени МЕЖДУ НачалоИнтервала И КонецИнтервала оптимизирует данный запрос.
#3 by azernot
#4 by azernot
+ Не, облажался, не универсальный запрос
#5 by newbling
я делал недавно.         |    И ВЫБОР
#6 by newbling
с учётом правой границы периода до бесконечности
#7 by newbling
Если не учитывать, то достаточно ПериодОкончанияДействия >= &Периодначала И ПериодНачала <= &ПериодОкончанияДействия
#8 by d546
в исходных есть гарантия, что начало периода больше конца периода?
#9 by newbling
пардон, задача немного другая
#10 by newbling
Хм, кажется, что проще циклом пробежаться, а ни в запросе мудрить.
#11 by qwasqu
В таблице левая дата всегда меньше правой.
#12 by newbling
Я бы просто цикл сделал с конца.
#13 by Ildarovich
В статье есть задача 25, а в статье - задача 14, которые ИМЕЮТ ОТНОШЕНИЕ к рассматриваемому вопросу. Проблема задачи в том, что периоды могут пересекаться, а 14 и 25 на это не рассчитаны. Поэтому я бы сделал так: сначала соединением с таблицей дат периода (получить ее можно многими способами, хоть из календаря) нашел все даты без повторений, а затем применил бы решение из 14.
#14 by newbling
по быстродействию быстрее выгрузить, отработать ручками в цикле, а потом опять грузануть. И логически проще.
#15 by Ildarovich
Вот все решение:
#16 by azernot
ДатаОкончанияСМинимальнойДатойНачала.ДатаОкончания ИЗ ГДЕ     ДатаОкончанияСМинимальнойДатойНачала1.ДатаНачала ЕСТЬ NULL УПОРЯДОЧИТЬ ПО     ДатаОкончанияСМинимальнойДатойНачала.ДатаНачала Я вроде бы дыр не нашёл
#17 by azernot
Добавь период с 01.01.16 по 31.12.16. Не сработает.
#18 by d546
ВЫБРАТЬ ГДЕ     Данные2.НачалоПериода ЕСТЬ NULL ;
#19 by d546
как то так
#20 by Ildarovich
Ну да, там максимум - 256 дней в периоде.
#21 by azernot
Добавь период 01.01.16 - 30.03.16 Не сравботает
#22 by d546
:)
#23 by Ildarovich
+ Ограничение 256 дат легко преодолеть, нарастив искусственную таблицу чисел. Если же вообще без нее, то вот вариант с использованием нарастающего итога: На четыре строчки длиннее, чем , нужно подсократить. Но зато показывает, что задачу можно решить за линейное время, если использовать идеи из .
#24 by Ildarovich
+ Вот самый короткий на текущий момент вариант. На 12 строчек короче, чем . Крайние точки выделяются условием несоединяемости не с каким интервалом, затем, в последнем запросе, они "спариваются":
#25 by Ildarovich
+ Можно еще на шесть строк короче:
#26 by Лефмихалыч
, снимаю шляпу, замерев в глубоком пардоне. Я серьезно - мне нравятся эти штуки-дрюки с запросами, которые ты делаешь. Это офигенно! :)
#27 by Garykom
+1 ЗЫ Моя тоже сильно уважать умеющих делать "операции на гландах автогеном"...
Тэги: 1С 8
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С