Garrys, немного поправил Вашу изначальную функцию: когда весь период находится в рамках одного интервала, стартовое значение длительности рассчитывалось неправильно. Также переименовал переменные.
Раньше не пользовался List.Generate и List.Accumulate, но кажется пора изучить. Такой подход для меня в новинку.
Результат полностью совпадает с моим решением, но по производительности существенно лучше. Даже так: ФЕНОМЕНАЛЬНО БЫСТРЕЕ!!! Большое спасибо за помощь!
Окончательный код функции прикрепляю, остальные действия без изменений:
| Код |
|---|
CombineFunction = (x)=>
[
PeriodStart = x{0},
Duration = x{1},
PeriodEnd = PeriodStart + #duration(0,0,0,Duration),
FirstInterval = DateTime.From(DateTime.ToText(x{0}, "dd.MM.yyyy HH:00"), "ru-RU"),
RecordsList = List.Generate(()=>
[i=1, Interval = FirstInterval, IntervalDuration = if PeriodEnd < FirstInterval + #duration(0,1,0,0) then Duration else Duration.TotalSeconds((FirstInterval + #duration(0,1,0,0) - PeriodStart))],
(x)=>x[Interval] < PeriodEnd,
(x)=>[i=x[i]+1, Interval = x[Interval] + #duration(0,1,0,0), IntervalDuration = if PeriodEnd > (Interval+#duration(0,1,0,0)) then 3600 else Duration.TotalSeconds(PeriodEnd - Interval)],
(x)=>[Interval = x[Interval], Duration = x[IntervalDuration]]),
Table = Table.FromRecords(RecordsList)
][Table],
|
AlienSx, ваш код успешно работает на тестовой версии. На рабочих данных не проверял, поэтому скорость работы пока не оценивал. Когда смогу проверить на рабочих данных, отпишусь в тему, чтобы другие формучане могли пользоваться.
Всем спасибо!