Forum Discussion

EricSteynMMD's avatar
EricSteynMMD
Frequent Visitor
6 years ago
Solved

Calculate Equipment State Duration per Shift

Hi All, I need help please.   I need to report on the duration that a piece of equipment was running in a specific state, during each shift. The issue is that the dataset only has entries when a st...
  • Anonymous's avatar
    Anonymous
    6 years ago

    here a solution "complete" (corresponding to the status of the information received 😁) avoiding the use of the function List.Accumulate.

     

    starting table:

     

     

    output Table:

     

     

    the code for the output table:

     

     

    let
    
        ct = Table.TransformColumnTypes(Table,{{"StateDateTime", type datetime}, {"EquipmentState", type text}, {"ShiftIndex", Int64.Type}}),
        idx=List.RemoveLastN(List.Distinct(ct[ShiftIndex]),1),
        lstR=List.Generate(
            ()=>[r=1,pos=List.PositionOf(ct[ShiftIndex],idx{0},Occurrence.Last), lr=sfht(ct{pos},ct{pos+1})], 
            each [r]<=List.Count(idx),
            each [r=[r]+1, pos=List.PositionOf(ct[ShiftIndex],idx{[r]},Occurrence.Last),lr=sfht(ct{pos},ct{pos+1}) ], 
            each [lr]
        ),
       tc= Table.Combine({Table.FromRecords(List.Combine(lstR)),Table}),
       grp = Table.Group(tc, {"ShiftIndex"}, {{"shIdx", each duration(_)}}),
        #"Expanded shIdx" = Table.ExpandTableColumn(grp, "shIdx", {"StateDateTime", "EquipmentState", "Duration"}, {"StateDateTime", "EquipmentState", "Duration"})
    in
        #"Expanded shIdx"

     

     

    the two functions used:

     

    sfht

     

    let
    
        listRows=(rL,rF)=>
        let
        shift=#duration(0,0,720,0),
        dL=rL[StateDateTime],
        dF=rF[StateDateTime],
        lr=List.Generate(
            ()=>[r=rL&[StateDateTime=#datetime(Date.Year(dL),Date.Month(dL),Date.Day(dL)+sh{1},sh{0},0,0)],idx=1],
            each [r][StateDateTime]<=dF,
            each [r=if Number.Mod(idx,2)=1 then [r]& [StateDateTime=[r][StateDateTime]+shift] else [r]&[ShiftIndex=[r][ShiftIndex]+1],idx=[idx]+1],
         each [r]   
        ), 
        sh=if Time.Hour(dL) < 6 then {6,0} else if Time.Hour(dL)<18 then {18,0} else {6,1}
    
        in lr
    
    in listRows

     

     

    and finally duration:

     

    let
    count=(tab)=>
    let
        ts=Table.Sort(tab,{"StateDateTime"}),
        ai = Table.AddIndexColumn(ts, "i", 0, 1)
       in
       Table.RemoveColumns(Table.AddColumn(ai, "Duration", each try if [ShiftIndex]=ai[ShiftIndex]{[i]+1} then Duration.TotalMinutes(ai[StateDateTime]{[i]+1}-[StateDateTime]) else "" otherwise""),{"i"})
    in count