|
Поиск пересекающихся интервалов в Таблице Значений | ☑ | ||
---|---|---|---|---|
0
kAndrat
02.04.19
✎
12:51
|
Всем привет.
Подскажите как можно запросом вытащить из ТаблицыЗначений пересекающиеся интервалы? Например есть таблица НачалоПериода КонецПериода 01.03.2019 05.03.2019 01.03.2019 05.03.2019 01.05.2019 03.05.2019 01.05.2019 04.05.2019 из Нее нужно получить два интервала 01.03.2019 05.03.2019 01.05.2019 03.05.2019 |
|||
1
Лодырь
02.04.19
✎
14:04
|
А что будет если в таблице встретится интервал 02.03.2019 - 02.05.2019?
|
|||
2
Радим1987
02.04.19
✎
14:07
|
Сгруппируй Сумма(бла) и отобрать где > 1
|
|||
3
fisher
02.04.19
✎
14:12
|
В чем необходимость делать это именно запросом?
В качестве стартовой заготовки: ВЫБРАТЬ * ИЗ Таб КАК Таб1, Таб КАК Таб2 ГДЕ Таб1.ДатаНачала МЕЖДУ Таб2.ДатаНачала И Таб2.ДатаОкончания ИЛИ Таб1.ДатаОкончания МЕЖДУ Таб2.ДатаНачала И Таб2.ДатаОкончания |
|||
4
sqr4
02.04.19
✎
14:14
|
(3) таблица одна.
Но результат из (0) мне не понятен |
|||
5
1Сергей
02.04.19
✎
14:15
|
(4) >>Но результат из (0) мне не понятен
+1 |
|||
6
fisher
02.04.19
✎
14:16
|
(4) Мне тоже :)
|
|||
7
13_Mult
02.04.19
✎
14:38
|
(0) А какова логика пересечения?
|
|||
8
zelyak
02.04.19
✎
14:41
|
Не понятна функция получения значения. Вообще не понятна.
|
|||
9
Said_We
02.04.19
✎
14:51
|
(0)
"из Нее нужно получить два интервала 01.03.2019 05.03.2019 01.05.2019 03.05.2019" а почему не ? 01.03.2019 05.03.2019 01.05.2019 04.05.2019 В (0) ерунду спросил. Если несколько периодов пересекаются и надо показать периоды к которым есть пересечения, то необходимо все и показывать. А если необходимо показывать периоды после сложения пересекающихся периодов, то так и надо спрашивать, только необходимо не забывать, что после пересечения периодов и сложения этих периодов их опять необходимо проверить на пересечение..... :-) Пример (1-й период и 4-й не пересекаются, но в результате период один с 01 по 15): 1. 01.01.2000 - 05.01.2000 2. 03.01.2000 - 07.01.2000 3. 06.01.2000 - 10.01.2000 4. 09.01.2000 - 15.01.2000 |
|||
10
Ёпрст
02.04.19
✎
15:01
|
(0) а как Май у вас с Мартом пересекся в ответе ?
|
|||
11
Ёпрст
02.04.19
✎
15:02
|
Периоды 01.03.2019-05.03.2019 и 01.05.2019-03.05.2019
не пересекаются, если что |
|||
12
Said_We
02.04.19
✎
15:06
|
(11) Нет его и не будет, скорее всего. Спросил ерунду. Мы голову ломаем что он спросить хотел, а он пиво пьет :-)
Весь апрель никому не верь. |
|||
13
kAndrat
02.04.19
✎
15:36
|
(3) Да, я примерно также и решил сделать, хотелось просто одним запросом все получить.
|
|||
14
kAndrat
02.04.19
✎
15:41
|
(4) Я упростить просто хотел вопрос.
Задача такова, что в результате запроса выводятся периоды отпусков сотрудников и нужно отловить пересечения и показать их руководителю. Хотелось выгрузить эти данные в таблицу и там прямо найти все пересечния) Но в итоге думаю реально проще и может даже правельнее сделать из (3) |
|||
15
Said_We
02.04.19
✎
15:54
|
(14) Тогда у вас каждое пересечение это минимум две строки.
Из примера в (0) что на входе, то и на выходе: НачалоПериода КонецПериода 01.03.2019 05.03.2019 01.03.2019 05.03.2019 01.05.2019 03.05.2019 01.05.2019 04.05.2019 |
|||
16
sqr4
02.04.19
✎
15:58
|
(12) тут правильный ответ)
|
|||
17
sqr4
02.04.19
✎
15:59
|
(12) ты почему то так вкусно написал, что мне тоже пивка захотелось
|
|||
18
Deon
02.04.19
✎
16:01
|
(14) Там же, наверно, ещё и пересечения в рамках одного отдела интересны, а не по всей конторе?
|
|||
19
Вафель
02.04.19
✎
16:25
|
т1.датанач <= т2.датакон и т1.датакон >= т2.датанач
|
|||
20
Said_We
02.04.19
✎
16:28
|
(18) Если про отпуска, то как правило внутри одного отдела по группам сотрудников, которые примерно одним и тем же занимаются. Т.е. что бы не страдал производственный процесс.
В той же бухгалтерии, бухгалтер по ОС и расчетчик ничего как правило про работу друг друга не знают и знать не хотят и могут идти в отпуск одновременно. |
|||
21
RomanYS
02.04.19
✎
16:30
|
(3) (14) Не правильно: если один период целиком внутри другого, пересечение в выборку не попадет
|
|||
22
Said_We
02.04.19
✎
16:35
|
(21) Зато другой период, который внутри попадет. :-)
|
|||
23
Garykom
гуру
02.04.19
✎
16:39
|
(0)(14) Запросами нормально никак, учите ЯП 1С и алгоритмы.
Потому что потом вам потребуется вывести сотрудников периоды отпусков которых пересекаются и далее скажут а давай по отделам, если в разных то нам пофиг. Попробуйте научиться думать вперед за людей дающих задачку, что они хотят и зачем. |
|||
24
Garykom
гуру
02.04.19
✎
16:39
|
(23) сорри *Только запросами.
Тут придется и ЯП и запросы использовать |
|||
25
Сияющий в темноте
02.04.19
✎
16:42
|
Сначала отсортировать все периоды по дате начала.
далее,из таблицы выбираем период с датой начала больше или равной нашей и меньшей или равной дате конца нашего периода,то есть виртуальную упорядоченную таблицу саму с собой соединить. |
|||
26
Garykom
гуру
02.04.19
✎
16:44
|
(25) Там еще отдел есть (будет) колонка и сотрудник, их надо сохранить.
Причем выбрать пересечения больше чем определенное кол-во дней. И да я просто телепатирую )) |
|||
27
Garykom
гуру
02.04.19
✎
16:47
|
(26)+ Хотя еще можно должности добавить с хитрой отдельной табличкой взаимозаменяемости для полного кайфа реальной задачки.
|
|||
28
kAndrat
02.04.19
✎
16:53
|
(26) Это уже все есть в базовой таблице, сотрудники подразделения с интервалами, я это специально не указал, чтобы голову по этому поводу не ломать. Нужно уже играться именно с пересечениями периодов.
|
|||
29
kAndrat
02.04.19
✎
17:04
|
(18) Да)
|
|||
30
fisher
02.04.19
✎
17:09
|
(21) Попадет. Там же каждый с каждым сопоставляется. Вот периоды с перекрестными границами попадут дважды. Я поэтому и написал, что это стартовая заготовка.
(23) Для поиска пересечений в рамках отделов достаточно добавить условие на равенство отделов. Сотрудники тоже сохранятся. |
|||
31
RomanYS
02.04.19
✎
17:12
|
(30) >> Я поэтому и написал, что это стартовая заготовка.
Так если из этой заготовки ещё и условие (неправильное) убрать от неё вообще ничего не останется. |
|||
32
fisher
02.04.19
✎
17:14
|
(31) Почему условие неправильное?
|
|||
33
RomanYS
02.04.19
✎
17:14
|
(21) (31) Сторно. Попадать будет
|
|||
34
fisher
02.04.19
✎
17:15
|
Не, если цель получить все зеркальные пересечения, тогда условие можно допилить. А если избавляться от "дублей", тогда смысла нет.
|
|||
35
Garykom
гуру
02.04.19
✎
17:34
|
(28) Потом тебе скажут "пересечение в 1-2 дня" это не страшно (убери их) и что будешь делать?
|
|||
36
fisher
02.04.19
✎
17:47
|
Вообще, есть четыре варианта пересечения периодов. Две зеркальные пары. Включение одного периода в другой и перекрестное пересечение.
Можно легко написать набор условий обеспечивающих как отсутствие дублей, так и наличие всех дублей (если для каждого сотрудника нужно отдельно показывать пересекающиеся с ним отпуска других сотрудников). (35) Расчет количества дней пересечения тоже несложно в запросе сделать (обработка тех же самых четырех вариантов). Пойми меня правильно. Я не фанат одного инструмента. И если что-то проще сделать пост-обработкой, я делаю это пост-обработкой. Но если например речь об отчете СКД, где нежелательно разбивать расчет по местам исполнения, то сложность этой задачи далека от запретительной. И по итогу проще сделать весь расчет в запросе. |
|||
37
Garykom
гуру
02.04.19
✎
17:55
|
(36) Для меня для подобных "разовых задач" проще кодом ибо это сделать быстрее, надежнее и гибче.
Легко исправить/допилить и пофиг что на больших данных запросы будут работать быстрее. Вот если решение в продакшен для тиражного то понятно лучше запросы. А фанаты одного инструмента мне напоминают забивальщиков гвоздей микроскопом. |
|||
38
fisher
02.04.19
✎
18:01
|
(37) В данной конкретной задаче поля для рефакторинга практически нет. Поэтому мое мнение прямо противоположное.
Вот когда подобное пытаются натянуть на анализ логов СКУД (расчет рабочего времени по входу/выходу), вот тут я полностью согласен. Там возможны хитрые краевые ситуации, которые замучаешься корректно в запросе реализовывать, да и не надо это. В коде это намного удобнее делается и допиливается на машине состояний. |
|||
39
Garykom
гуру
02.04.19
✎
18:11
|
(38) Данная конкретная задача в (0) описана не полностью и совсем не в том виде в котором ее потребуют.
Вот полную задачу запросом еще ладно, но пытаться по несколько раз переделывать запрос это мрак и потеря времени. Запросы это намного более сложный и высокоуровневый инструмент, там небольшое дополнение к задаче и все переделывать. Особенно задачи на временные интервалы неудобны для решения запросами. Потому что через условия это решается банально в двойном цикле. Допустим кодом писать 5-10 минут. Сколько уже потратил времени ТС на решение запросами? А еще потратит? |
|||
40
Сияющий в темноте
02.04.19
✎
23:16
|
Пересечение иньервалов в общем случае требует полный скан таблицы так как интервалы очень плохо индексируются,поэтому,нагрузка на скуль будет большая и вопрос переноса анализа в код достаточно актуален.
для быстрого выбора интервалов нужнл делать хитрый индекс по начальной дате интервала и длине,тогда полного сканирования можно избежать. |
|||
41
Garykom
гуру
02.04.19
✎
23:37
|
(40) Не начальной дате лучше а даты/время середины интервала и длине
|
|||
42
Garykom
гуру
02.04.19
✎
23:39
|
(41) Хотя пофиг можно и начальной
|
|||
43
Злопчинский
03.04.19
✎
00:51
|
гп ИСе у Ильдаровича вроед подробно запросомрассмотрено
|
|||
44
zva
03.04.19
✎
07:35
|
||||
45
НЕА123
03.04.19
✎
07:58
|
(14)
а может не нужны интервалы? календарь с количеством отдыхающих. раскрасить, расшифровать - обычно так. |
|||
46
fisher
03.04.19
✎
09:24
|
(39) Свое мнение я уже высказал. Как по мне, запросом эта задача решается и быстрее и лучше, в т.ч. на перспективу. Вы сводите по сути к тому, что лучше использовать тот инструмент, который лучше знаешь :)
(40) Эти рассуждения имели бы какой-то смысл во "взрослых" языках. На практике в 1С, на тех объемах комбинаторных данных, которые могли бы создать ощутимую нагрузку на сиквел, реализация на языке 1С начинает отставать в производительности заметно раньше. Уже от ста тысяч итераций с банальной арифметикой бывает быстрее загнать исходные таблицы в сиквел, вычислить запросом и получить обратно результат. ЗЫ. Я себя ощущаю в необычном амплуа. Обычно это я доказываю апологетам запросов, что "не запросами едиными" :) |
|||
47
Мимохожий Однако
03.04.19
✎
09:33
|
Заполнить интервалы днями, вывести в длинную таблицу значений с колонками по дням и потом схлопнуть по отделам и просуммировать. Количество дней по итогу каждого дня даст то, что хотят.
|
|||
48
Мимохожий Однако
03.04.19
✎
09:34
|
Возможно, через СКД это удобнее сляпать
|
|||
49
Garykom
гуру
03.04.19
✎
09:37
|
(47) Сколько в году дней знаем? Количество записей полученных длинных таблиц представляем если там ну пусть пара тысяч человек работают?
|
|||
50
Мимохожий Однако
03.04.19
✎
09:39
|
(49) Я бы ограничил период текущим годом. 365 колонок
|
|||
51
Мимохожий Однако
03.04.19
✎
09:40
|
Возможно, регистры расчета пригодились бы
|
|||
52
Garykom
гуру
03.04.19
✎
09:45
|
(50) КОЛОНОК? Эээ вы в курсе что оно если и взлетит то низехонько-низехонько...
|
|||
53
Bigbro
03.04.19
✎
09:48
|
вообще не понимаю зачем таблицы колонки и все прочее.
взяли даты отсортировали. для даты начала целевая функция +1 для даты окончания -1. бежим по списку от начала к концу. целевая функция стала 2 и больше - начался интервал пересечения. стала 1 или ноль - закончился. |
|||
54
Garykom
гуру
03.04.19
✎
09:48
|
(53) Запросами?
|
|||
55
Bigbro
03.04.19
✎
09:54
|
(54) мне всегда казалось что нужно использовать подходящие инструменты. в этой задаче я не вижу как можно ее легко и элегантно решить запросами. а без них я написал. но это конечно не значит что кто-то сейчас не напишет простой и красивый запрос, решающий задачу...
|
|||
56
Лодырь
03.04.19
✎
09:55
|
(54) можно реализовать и запросом этот алгоритм. Но смысла нет.
|
|||
57
Мимохожий Однако
03.04.19
✎
10:01
|
(52) Да. Понимаю. Для старта и анализа достаточно.
|
|||
58
Garykom
гуру
03.04.19
✎
10:10
|
Да алгоритм давно разжеван для решения запросами.
Делается отсортированный список-таблица всех уникальных дат (мельчайших интервалов), начала и конца в одну колонку. Далее присоединяем к каждой дате кол-во дней до следующей по порядку дате. Ну и банально каждый большой интервал отпуска набираем их этих базовых-мельчайших интервалов. Смотрим пересечения по базовым интервалам - профит. Даже кол-во дней пересечения легко считается. |
|||
59
Garykom
гуру
03.04.19
✎
10:11
|
(58)+ Есть вариант каждый базовый интервал задавать не датой начала и длительностью в днях, а серединой интервала (дата/время) и длительностью в секундах.
|
|||
60
Мимохожий Однако
03.04.19
✎
10:13
|
(58) А теперь замени слова "таблица всех уникальных дат (мельчайших интервалов)," на "все даты в интервалах" и получишь то, что описал я и то, что было подсказано в (2)
|
|||
61
Garykom
гуру
03.04.19
✎
10:27
|
(60) Ты предложил по дням, т.е. еще мельче поделить.
В (2) ничего не подсказано какая то Нострадамусина. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |