1. ildarovich 6713 12.09.15 13:55 Сейчас в теме

В каких задачах может потребоваться определять интервалы

Есть таблица, содержащая множество дат, дат со временем или просто чисел.
Требуется построить по этой таблице интервалы, на которые исходные даты (числа) разбивают временную (числовую) ось.
К примеру, есть даты установки цен. По ним можно определить интервалы постоянства цен в виде: начало действия цены - начало действия следующей цены.
Или, к примеру, есть даты документов отгрузки. Тогда можно определить величины промежутков времени между отгрузками: определить, к примеру, минимальный или максимальный интервал между отгрузками одного товара или одному контрагенту.
Задача решается запросом следующего вида
ВЫБРАТЬ
Слева.Дата КАК От,
МИНИМУМ(Справа.Дата) КАК До
ИЗ Даты КАК Слева 
ЛЕВОЕ СОЕДИНЕНИЕ Даты КАК Справа
ПО Слева.Дата < Справа.Дата
СГРУППИРОВАТЬ ПО Слева.Дата

Интересуют разнообразные примеры таких задач и то, насколько часто они встречаются. Особенно случаи, когда исходные множества достаточно большие, когда приведенный запрос работает долго.
Вознаграждение за ответ
Показать полностью
Ответы
Избранное Подписка Сортировка: Древо
2. spacecraft 12.09.15 17:19 Сейчас в теме
(1) ildarovich, делал решение на интервалы. Для парковки. Интервал времени парковки разбивался на разные виды интервалов (ночная, дневная) с определением цены каждого вида из периодических регистров сведений (временные рамки и цена могла меняться). Но там не такое большое кол-во интервалов получалось, так что решение не нагрузочное получилось. Что один день, что год рассчитывался быстро.
Единственная сложность была в логике разбития на интервалы, когда один из них пересекает нулевую временную метку (содержит часть времени одного и часть другого дня), без сильного усложнения запроса.
Все делалось одним запросом.
ildarovich; +1 Ответить
5. kot30688 3 14.09.15 02:11 Сейчас в теме
(1) ildarovich, Например, интервал нахождения сотрудника на территории предприятия. Решалось в рамках учета рабочего времени на предприятии, правда там мы брали интервал в 1 минуту и проверяли предшествующее событие (вход, действие местной командировки)
ildarovich; +1 Ответить
8. superkuzja 3 14.09.15 10:33 Сейчас в теме
(1) ildarovich, в ЗУП'е постоянно решаются такие задачи - связанные с изменением состояния сотрудников. В крупной компании (численность персонала > 1000) за достаточно большой период запрос может выполняться долго...
ildarovich; +1 Ответить
11. konstruktiv 14.09.15 12:34 Сейчас в теме
(1) ildarovich, не совсем уверен, что подойдет, но: не так уж и редко возникает задача сформировать "динамический срез последних". То есть стандартный функционал периодических регистров сведений, дает получить какую-либо информацию только на определенную дату, передаваемую в качестве параметра. Например, регистр "Работники" в ЗУП. Можно получить фактическую численность сотрудников на определенный момент, а если необходимо видеть ее в динамике, допустим, по месяцам? В цикле вызывать СрезПоследних - плохое решение. Обычно делается один запрос, имеющий в себе подобную конструкцию, которую вы описали. Из рабочих примеров: это было необходимо для вычисления суммы экономии бюджета на заработной плате сотрудников, чьи места есть в штате, но по факту человека еще на это место не нашли. Нужны были динамические срезы по штатной и фактической численности. А еще нужен был динамический срез, чтобы узнать цены и скидки на будущие периоды, чтобы персонал торговых залов вовремя обновлял ценники. Обе задачи в условиях крупного предприятия и больших временных периодов довольно ресурсоемки. И на практике пришлось дорабатывать архитектуру базы, чтобы не было необходимости в использовании таких "срезов".
ildarovich; +1 Ответить
12. ildarovich 6713 14.09.15 13:36 Сейчас в теме
(11) konstruktiv, дорабатывать архитектуру - это добавили реквизит окончание действия цены (скидки, трудового договора, вакансии)? Какие примерно затраты времени до этого были?
13. konstruktiv 14.09.15 14:11 Сейчас в теме
(12) ildarovich, был добавлен регистр, который хранил уже готовые и промежуточные показатели в нужной периодичности. Конкретно для расчета экономии заработной платы - по дням. А заполнялся он регламентным заданием каждый день с использованием уже классического среза последних. Ну плюс еще пришлось предусмотреть ситуацию редактирования данных задним числом и перезаполнения регистра. Ну конечно с выборкой данных из нового регистра время на то, чтобы узнать сколько сэкономили на таком-то отделе за год, сократилось с 1-3 минут (что допустим просто для отчета не очень приемлемо) до доли секунды.
15. Cool_vsi 14.09.15 16:38 Сейчас в теме
(1) ildarovich, при замере производительности(объект, дата начала, дата конца и прочее) и постройке отчетов, используется такой алгоритм, а когда замеры производятся постоянно, много объектов исследование с ними часто работают и большой онлайн в базе, то важный момент чтобы этот алгоритм работал быстро.
3. unoDosTres 12.09.15 22:05 Сейчас в теме
не знаю относится ли это к этой задаче, в большой базе количество активных пользователей в районе 2000 по АПДЕКСу фиксировались формирования отчетов, ввиду высокой интенсивности формирования некоторых из них было принято решение поставить ограничение по загрузке ЦПУ сервера СУБД, т.е. если загрузка более 70% формирование этих отчетов было запрещено системой, в итоге сравнивались временные интервалы между формированиями до и после введения ограничения, ввиду того что количество формирований на конец дня сократилось незначительно
4. VyacheslavKuznetsov 13.09.15 22:57 Сейчас в теме
Автоматическое создание накладных, например. Накладная заполняется произвольными товарами, которые есть в остатках организаций, таким образом, чтобы не возникало отрицательных остатков. Для этого приходится выбирать остатки с периодичностью "по регистратору" и брать в качестве доступного минимальное положительное значение. Но тут разбитие на интервалы происходит вообще средствами платформы.
6. herfis 283 14.09.15 08:57 Сейчас в теме
Любые СКУДы решают подобные задачи. На больших объемах данных запросом плохо, т.к. очень часто нужно анализировать много краевых условий с принятием различных решений. Запрос привлекателен, но нерационален для подобных задач, т.к. подобные задачи плохо ложатся на операции над множествами и гораздо проще и эффективнее решаются "классическими" методами.
9. herfis 283 14.09.15 10:37 Сейчас в теме
(6) herfis +
Например, часто бывает необходимо вылавливать ситуации отсутствия "входа" при наличии "выхода" и наоборот и автоматически принимать по ним решение, если это возможно. Часто правильное решение помогает принять анализ ближних интервалов. Например, очевидно что несколько "входов" подряд с секундным интервалом можно/нужно интерпретировать как один. Также очевидно, что вход сегодня а выход завтра - скорее всего некорректный интервал для офисного работника.
В общем, не совсем понятно, зачем тут запрос, если одним запросом всё равно не обойдешься (или это будет нетривиально и неэффективно) если задача решается гибко и эффективно за один проход по отсортированной таблице событий.
ildarovich; +1 Ответить
7. ildarovich 6713 14.09.15 09:29 Сейчас в теме
Добавил вознаграждение
10. dj_serega 367 14.09.15 12:06 Сейчас в теме
Может быть еще и такая задача:
Есть торговые агенты, у каждого несколько точек.
ТА1 - 15 ТТ.
ТА2 - 10 ТТ.
Рабочее время 8 часов.
Нужно получить Максимальное время присутствия агентов на ТТ.
Учесть что на дорогу между ТТ у агентов есть 30 минут.
9:00-9:15 - ТТ1
9:45-10:00 - ТТ2
10:30-10:45 - ТТ3 и тд.

Можно усложнить задачу и добавить 1 час обеда.
ildarovich; +1 Ответить
14. ipoloskov 65 14.09.15 14:33 Сейчас в теме
Выбрать 
   ИсходнаяТаблицаСДатами.Период
Поместить ВТ_Даты
Из &ИсходнаяТаблицаСДатами КАК ИсходнаяТаблицаСДатами;

Выбрать
  ВТ_Даты1.Период Как НачалоПериода,
  МИНИМУМ(ВТ_Даты2.Период) КАК КонецПериода
ИЗ ВТ_Даты КАК ВТ_Даты1
ЛЕВОЕ СОЕДИНЕНИЕ ВТ_Даты КАК ВТ_Даты2
ПО ВТ_Даты2.Период > ВТ_Даты1.Период
Сгруппировать по ВТ_Даты1.Период;
Показать
16. axelerleo 286 14.09.15 16:50 Сейчас в теме
Ну на вскидку - все и всяческие оборачиваемости:
оборачиваемость дебиторской задолженности
дебиторка по срокам долга
оборачиваемость складских запасов
динамика оборачиваемости денежных средств
ABC анализ по регулярности продаж
расчетные задачи - проценты по вкладам, дивиденды по акциям, почти весь расчет зарплаты
билинг и тарификация - сотовая связь, сигнализации, интернет, и т.д.

при желании можно еще вспомнить, где постоянно приходится бить список дат на интервалы по разным критериям...

Добавлено
Стат. анализ, планирование, прогнозирование
jobkostya1c8; ildarovich; +2 Ответить
17. МихаилМ 16.09.15 16:47 Сейчас в теме
задача учета использования ресурсов в разрезе времени - расписание использования ресурсов.

тк 1с8 не умеет работать с пространственными индексами, а по интервалу эффективного индекса не построить,
то можно заменить одну записсь интервала времени (т1,т2) множеством записей равных интервалов (tn).
с дополнительными полями для уточнения индекса (признак активности,укрупненный интервал)

и запрос из (0) будет упаковывать данные.
ildarovich; +1 Ответить
18. jobkostya1c8 16.09.15 20:59 Сейчас в теме
Сдается мне что (как бы политкорректно) вопрос провокационный - задан то очень известным разработчиком и автором кучи очень хороших статей по программированию с целью отлова бродячих программистов 1С (шутка).
А так эту задачку "как разбить массив с датами на интервалы ЗАПРОСОМ!!!" задали в крутой конторе где сидят разработчики 1С куда я все как начинающий ходил-ходил, а потом находил работу с з/п гораздо большей чем у них, а там не было таких задач, а было черт знает что в т.ч. и 1С 7.7 и 8.х и 9 и "кто эту желтую чуму вообще принес" что надо программиста почитать как юлия цезаря.
Насчет этой задачи я решил так: не буду никуда смотреть догадаюсь сам и даже когда был большой запрос в БП 2.0 по интервалам нахождения основного средства в одной из печатных форм "ОС-Х" я обратил внимание, что есть соединение в запросах 1С не на равенство, а на "больше-меньше". Сразу весь рабочий день потратил на решение этой задачи на бумажке, потом в консоле и ура вот оно решение. Кстати, подобная методика плохо прописана даже в руководствах по запросам, которые трудно достать, а книги покупать за собственный счет меня мой начальник отучил - в интернете такого добра навалом.
Дальше даже когда на одном из собеседований на оптимизатора кто-то спросил про "запрос списание по партиям по методу ФИФО" я тоже сутки потратил и что-то сделал (конечно не оптимальное, потом ошибку с "нулями" нашел).
Так самое веселое потом такие задачки когда предложили в этой самой первой конторе разработчиков, которые я теперь решаю в уме я уже им озвучил вопрос: "А как так когда полный дурак приходишь не к Вам то берут на ура и потом возятся - доламывай 1С не хочу, а как такие запросы научишься решать и по-человечески все делать никуда не берут?". И дальше уже официльно "можно попросить чтоб в Ваш список где вы все мои приходы фиксируете занести что это мое последнее посещение и не приглашать".
А реальные задачки подобные этой все-таки иногда есть. Например если отчет в СКД, то запросами сам бог велел или когда таблицу с днями месяца соединять с чем-то где не на каждую дату есть значение. А так, если запрос сложнее делать то что-то попроще и кодом, кодом.
19. jobkostya1c8 16.09.15 21:01 Сейчас в теме
Конечно, запросы знать надо. В основном ими все дергается из базы, но обычно 1-2х таблиц бывает достаточно если не сильно крутые отчеты.
20. sanek_kop 13 17.09.15 15:39 Сейчас в теме
Была похожая задача. Необходимо было определить производительность работы "наборщиков" на складе. Есть дата начала набора, дата окончания набора и необходимо было контролировать производительность работы и еще в придачу время между наборами, чтобы сотрудники не "валынили". В результате не стали строить огромный запрос, а просто при начале набора просчитывали все данные по сотруднику (находили прошлый набор и замеряли время с окончания до текущего момента), результат писался в документ набора. В результате все свелось к запросу по реквизиту документа.
ildarovich; +1 Ответить
21. Nefertary 107 18.09.15 09:59 Сейчас в теме
Управление цепочками поставок.
Когда едет партия товаров из Китая допустим. В ключевых узлах перегрузки она меняет транспорт, объединяется с другими партиями или разбивается.
И нужно просчитать прогнозную дату прибытия (известны плановые сроки прохождения между ключевыми точками разными видами транспорта).
ildarovich; +1 Ответить
22. ildarovich 6713 01.10.15 11:55 Сейчас в теме
Спасибо всем, кто принял участие в обсуждении этого вопроса. Целью моего вопроса был подбор практических примеров использования для нового быстрого метода определения интервалов в запросе. Сам метод описан в статье: Быстрое определение интервалов в запросе. Я взял только один пример: построение гистограммы интервалов между продажами, поскольку легко получить данные для теста - информация о продажах есть в очень многих конфигурациях.
Другие применения типа СКУД или всяких средних по времени по регистру сведений (с РН проблемы нет) более экзотичны, но могут быть также рассмотрены, если появится такая необходимость.
dj_serega; +1 Ответить
Оставьте свое сообщение
Новые вопросы с вознаграждением
Автор темы объявил вознаграждение за найденный ответ, его получит тот, кто первый поможет автору.

Вакансии

Программист, аналитик, эксперт 1С
Санкт-Петербург
По совместительству

Бизнес-аналитик 1С
Санкт-Петербург
зарплата от 100 000 руб.
Полный день

Программист 1С
Москва
зарплата от 150 000 руб. до 180 000 руб.
Полный день

Программист 1С
Москва
зарплата до 160 000 руб.
Полный день

Автор новостных обзоров на тему 1С и бухучета
Санкт-Петербург
По совместительству