Здравствуйте
Есть задача - сгруппировать некоторый длительный интервал по часам.
Например:
Начало 11.03.2024 12:45:00
Длительность 01:10:00
Нужно разбить длительность так, чтобы было видно, в какой часовой интервал сколько времени было задействовано.
Результат должен быть таким:
12:00-13:00 = 00:15:00
13:00-14:00 = 00:55:00
Сейчас использую такое решение, но оно сильно тормозит на больших объемах на этапе "Список_секунд".
Код |
---|
let
Источник = Excel.CurrentWorkbook(){[Name="Исходник"]}[Content],
Список_секунд = Table.AddColumn(Источник, "ListDateTimes",
each
List.DateTimes([DateTimeStart],[Duration],#duration(0, 0, 0, 1)), //Формируем список всех секунд, которые сотрудник провел в указанном статусе в рамках сессии
type list),
Начало_часа = Table.TransformColumns(Список_секунд,
{
{"ListDateTimes", each List.Transform(_, each Time.StartOfHour(_)), type list} //Вычисляем начало часа для каждой секунды (определяем интервал для каждой секунды)
}),
Развернуть_ListDateTimes = Table.ExpandListColumn(Начало_часа, "ListDateTimes"),
Группировка_по_интервалам = Table.Group(Развернуть_ListDateTimes,
{"Condition", "ListDateTimes"},
{{"Duration", each Table.RowCount(_), Int64.Type}} //Группируем секунды по началу часа, к которому они принадлежат
),
Измененный_тип = Table.TransformColumnTypes(Группировка_по_интервалам,{{"ListDateTimes", type datetime}})
in
Измененный_тип |
Прикрепляю пример файла.
Есть ли более быстрое решение данной задачи в Power Query? Объем рабочих данных составляет 500k+ строк ежедневно.
Рад готовым решениям, подсказкам, ссылкам.