Forum Discussion

rudivonstaden's avatar
rudivonstaden
Frequent Visitor
6 years ago
Solved

Get durations from event data

I am trying to analyse my data in Power BI to work out how long we spend on tickets. The data sits in two tables.   The first table (Issue Timings) shows when an issue is created or closed. ...
  • rudivonstaden's avatar
    rudivonstaden
    6 years ago

    I have managed to work it out in DAX after adding an index column in M. My query is now:

    let
        Source = Excel.Workbook(File.Contents("D:\tmp\timing_data\timing_data.xlsx"), null, true),
        Issues_Sheet = Source{[Item="Issues",Kind="Sheet"]}[Data],
        #"Promoted Headers" = Table.PromoteHeaders(Issues_Sheet, [PromoteAllScalars=true]),
        #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Issue Number", Int64.Type}, {"Created", type datetime}, {"Closed", type datetime}}),
        #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"Issue Number"}, "Attribute", "Value"),
        #"Renamed Columns" = Table.RenameColumns(#"Unpivoted Columns",{{"Attribute", "Event"}, {"Value", "DateTime"}}),
        #"Reordered Columns" = Table.ReorderColumns(#"Renamed Columns",{"Issue Number", "DateTime", "Event"}),
        #"Appended Query" = Table.Combine({#"Reordered Columns", #"Issue Events"}),
        #"Sorted Rows" = Table.Sort(#"Appended Query",{{"Issue Number", Order.Ascending}, {"DateTime", Order.Ascending}}),
        #"Added Index" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1),
        #"Reordered Columns1" = Table.ReorderColumns(#"Added Index",{"Index", "Issue Number", "DateTime", "Event"})
    in
        #"Reordered Columns1"

     

    In DAX I added a calculated column for Pipeline:

    Pipeline = 
    VAR NextEvent = LOOKUPVALUE('Issues Timings'[Event],'Issues Timings'[Index],'Issues Timings'[Index]+1)
    RETURN IF('Issues Timings'[Event] = "Created",
    IF(NextEvent = "In Progress","Up Next",
    IF(NextEvent = "Up Next", "New Issues",
    "In Progress" )),
    'Issues Timings'[Event])
    and another calculated column for duration:
    Duration = 
    VAR StartDateTime = 'Issues Timings'[DateTime]
    VAR StartTime = TIME(8,0,0)
    VAR EndTime = TIME(17,0,0)
    VAR NextIssue = LOOKUPVALUE('Issues Timings'[Issue Number],'Issues Timings'[Index],'Issues Timings'[Index]+1)
    VAR EndDateTime = IF(NextIssue = 'Issues Timings'[Issue Number], LOOKUPVALUE('Issues Timings'[DateTime],'Issues Timings'[Index],'Issues Timings'[Index]+1),'Issues Timings'[DateTime])
    VAR NetWorkDays =
    COUNTROWS (
    FILTER (
    ADDCOLUMNS ( CALENDAR ( StartDateTime, EndDateTime ), "Day of Week", WEEKDAY ( [Date], 1 ) ),
    [Day of Week] <> 1
    && [Day of Week] <> 7
    && NOT(CONTAINS(Holidays,Holidays[Date],[Date]))
    )
    )
    RETURN
    IF(OR(EndTime<StartTime,EndDateTime<=StartDateTime),0,
        (NetWorkDays
        -(1
        *IF(MOD(StartDateTime,1)>EndTime,1,
            (MAX(StartTime,MOD(StartDateTime,1))-StartTime)
            /(EndTime-StartTime)))
        -(1
        *IF(MOD(EndDateTime,1)<StartTime,1,
            (EndTime-MIN(EndTime,MOD(EndDateTime,1)))
            /(EndTime-StartTime))))
        *(EndTime-StartTime)*24)
     
    The Duration column applies the logic in this page to calculate the working hours for each Issue in each Pipeline. The solution file is here.