Страницы: 1
RSS
Power Query - время простоя оборудования
 
Привет всем!
Нужна помощь в поиске наверное немного нестандартного решения.
Есть оборудование и оператор его обслуживающий. Задания однотипные, но отличаются по объему обрабатываемых деталей.
Время начала обработки и время окончания фиксируется в БД. Для каждой операции создается отдельная строка.
Время выполнения посчитать не проблема. А вот время простоя оборудования между операциями посчитать оказалось той еще задачей.
Как сделал видно в файле. Но расчет ОЧЕНЬ громоздкий и тупит на большом объеме данных ну очень сильно.
Да и изяществом мое решение так себе...

Логика моего расчета:
-если оборудование, дата и час окончания в текущей записи=оборудованию, дате и часу начала в следующей записи, то вычитаем из времени начала следующей записи время окончания для текущей записи

-если есть переход на час(определяется в столбце Е), то вычитаем от часа текущей записи+"59:59" значение окончания для текущей записи. Для нового часа вычитаем из времени начала час+"00:00"
-Если есть переход по дате или оборудованию - ничего не считаем

Собственно вопрос - возможно ли эту логику переложить в PQ? :) желательно с сокращением времени обработки


Заранее благодарен за любые советы и примеры!
 
Полагаю, PQ Вам не потребуется, напишимте правильно формулы и все будет "быстро" считаться.
Изменено: TheBestOfTheBest - 14.10.2019 10:30:40
Неизлечимых болезней нет, есть неизлечимые люди.
 
Цитата
MadG . написал:
-Если есть переход по дате или оборудованию - ничего не считаем
А в файле примере не так. ;) Но если следовать описанию в посте то вот так например:
Код
let
    //Функция, которая добавляет в таблицу (указанную как первый аргумент) копию столбца (указанного во втором аргументе) со смещением элементов на 1 строку вверх или вниз (в третьем аргументе 0 - вниз / 1 - вверх). 
    fnTableAddOffsetColumn = ( tbl as table, clmn as text, dir as number ) => //
        if dir = 0 
            then Table.FromColumns( 
                Table.ToColumns( tbl ) & Table.ToColumns( #table( {clmn}, {{null}} ) & Table.RemoveLastN( Table.SelectColumns( tbl, {clmn}), 1 ) ), 
                Table.ColumnNames( tbl ) & {"Пред."&clmn} )
            else Table.FromColumns( 
                Table.ToColumns( tbl ) & Table.ToColumns( Table.RemoveFirstN( Table.SelectColumns( tbl, {clmn}), 1 ) & #table( {clmn}, {{null}} ) ), 
                Table.ColumnNames( tbl ) & {"След."&clmn} ),

    Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
    SelectedColumns = Table.SelectColumns(Source,{"Номер оборудования", "Дата", "Время начала", "Время окончания"}),
    GroupedRows = Table.Group(SelectedColumns, {"Номер оборудования", "Дата"}, {{"Таб", each fnTableAddOffsetColumn( Table.Sort( _, {{"Время начала", Order.Ascending}} ), "Время начала", 1 ), type table}}),
    Combine = Table.Combine( GroupedRows[Таб] ),
    ChangedType = Table.TransformColumnTypes(Combine,{{"Дата", type date}, {"Время начала", type time}, {"Время окончания", type time}, {"Номер оборудования", type text}, {"След.Время начала", type time}}),
    AddedColumn = Table.AddColumn(ChangedType, "Простой", each [След.Время начала] - [Время окончания], type duration)
in
    AddedColumn
Изменено: PooHkrd - 14.10.2019 10:34:32
Вот горшок пустой, он предмет простой...
 
Спасибо всем!

Пошел разбирать примеры!
Страницы: 1
Наверх