Страницы: 1
RSS
Оптимизация скорости вычисления количества рабочих дней выполнения работ в PQ
 
Добрый день,
Сразу прошу прощения, что не прикладываю файл с примером, т.к. вопрос больше теоретический.
  1. Есть большая таблица (более 100 тыс. строк) со списком работ, выполненных за год. Для каждой "работы" указана дата/время начала и окончания выполнения (Id работы, <... дополнительные данные по работе>, ДатаВремяНачалаВыполнения, ДатаВремяОкончания).
  2. Есть отдельная таблица со списком всех рабочих дней в году.
  3. Необходимо вычислить количество рабочих дней для каждой выполненной работы. Далее вычисляется общее количество часов/минут для получения чистого рабочего времени, в течение которого работа была выполнена.
Проблема — очень медленная скорость вычисления количества рабочих дней для каждой работы.

Порядок вычисления:
1. Добавляется столбец со списком всех календарных дней, в течение которых выполнялась работа:
Код
List.Dates(Date.From([DateTimeBegin]) + #duration(1,0,0,0), Number.From(Date.From([DateTimeEnd])) - Number.From(Date.From([DateTimeBegin])), #duration(1,0,0,0))
2. Затем добавляется еще один столбец, в котором собирается список только рабочих дней.
Код
List.Select([список из п1.], each List.Contains("Таблица, содержащая только столбец с рабочими днями", _))

Понимаю, что происходит каждый элемент одного списка сравнивается с каждым элементом другого. И это, скорее всего, и влияет на скорость.
Пробовал другой вариант для п.2 через List.Intersect() но скорость вычислений примерно такая же.

Хотел спросить совета, может быть возможен другой, более быстрый алгоритм для расчета рабочих дней?
Как вариант, создавать список для сравнения не рабочих дней, а нерабочих. Их - меньше, стало быть и скорость будет чуть выше?

Или же есть еще более быстрый вариант?

Заранее благодарю за конструктивные ответы.
 
1. List.Buffer списка рабочих дней, отсортированного по возрастанию
2. Ищем позиции дат начала и окончания в списке рабочих дней с помощью List.PositionOf с опцией Occurrence.First
3. Разница позиций даст искомый рез-т
Пришелец-прораб.
 
Цитата
написал:
1. List.Buffer списка рабочих дней, отсортированного по возрастанию
2. Ищем позиции дат начала и окончания в списке рабочих дней с помощью List.PositionOf с опцией Occurrence.First
3. Разница позиций даст искомый рез-т
Спасибо за оперативный ответ.
Всё "взлетело" (по скорости).
Благодарю еще раз. Тему можно закрывать.
Страницы: 1
Наверх