Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
Anonymous
Not applicable

Time status

Hi all,

 

I have data that looks like this:

 

 

DateTimeStatus
1899-10-1202:40:00M
1899-10-1202:40:50M
1899-10-1202:41:21X
1899-10-1202:41:56X
1899-10-1202:42:34X
1899-10-1202:43:01M
1899-10-1202:44:21M
1899-10-1202:44:59X
1899-10-1202:45:46X
1899-10-1202:46:38M

 

Now what I want to do is to calculate how much time the status was "X" and so I would need to calculate the time between the first record that has X till the last record that has X with no other status then X between them. So for example in my dummy data you can see that this happens 2 times: 02:41:21 until --> 02:42:34 And 02:44:59 until --> 02:45:46.

 

So my expected result would be: 00:01:13 + 00:00:47 = 00:02:00 X status

 

I hope the above is understandable, thanks in advance !

 

Regards,

L.Meijdam

2 ACCEPTED SOLUTIONS

Revised solution below. You can create a new - blank - query, go to the advanced editor and replace the default code by the code below.

 

Remark: the first step was the result of using option "Enter Data". If you want to adjust data, you can use the gear button at the right from "Source" in the "Applied Steps" pane at the right hand side of the query window.

 

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("fc5LCoAwDATQu2RdMN+qcwf3Qun9r2GhGwNWyGLgkUxaI5FNx7DsVIgVzmAe8aJepmrWyJp2BSoj3t+7gqhJ7a0K87UaWFJvUp+9S41zfTngP19V2DEv9wc=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Date = _t, Time = _t, Status = _t]),
    Typed = Table.TransformColumnTypes(Source,{{"Date", type date}, {"Time", type time}, {"Status", type text}}),
    AddedDateTime = Table.AddColumn(Typed, "DateTime", each [Date] & [Time], type datetime),
    Grouped1 = Table.Group(AddedDateTime,
                           {"Status"},
                           {{"First", each List.Min([DateTime]), type datetime},
                            {"Last",  each List.Max([DateTime]), type datetime}},
                           GroupKind.Local),
    AddedFirstDate = Table.AddColumn(Grouped1, "First Date", each DateTime.Date([First]), type date),
    AddedLastDate = Table.AddColumn(AddedFirstDate, "Last Date", each DateTime.Date([Last]), type date),
    #"Added Custom" = Table.AddColumn(AddedLastDate, "Date", each List.Dates([First Date],Duration.Days([Last Date]-[First Date])+1,#duration(1,0,0,0)), type {date}),
    #"Expanded Date" = Table.ExpandListColumn(#"Added Custom", "Date"),
    AddedStart = Table.AddColumn(#"Expanded Date", "Start", each if [Date] = [First Date] then [First] else [Date] & #time(0,0,0), type datetime),
    AddedEnd = Table.AddColumn(AddedStart, "End", each if [Date] = [Last Date] then [Last] else [Date] & #time(23,59,59.9999999), type datetime),
    AddedDuration = Table.AddColumn(AddedEnd, "Duration", each [End] - [Start], type duration),
    SelectedColumns = Table.SelectColumns(AddedDuration,{"Status", "Date", "Duration"})
in
    SelectedColumns

 

The result is a table with 1 row per status/date. This will allow you to filter on status and/or dates in your visualizations.

Also the total durations - these are decimal values in the data model - need to be calculated in your visuals - or with DAX - as these depend on filter context.

 

I don't know if the (total) durations can be formatted as (h):mm:ss: that would require some DAX beyond my knowledge.

 

My advice would be to raise a new topic, specifically for "Totalling decimal values in DAX and have the results displayed as {h}:mm:ss". (Please use similar text as the topic title. "Time status" won't win the best topic title award).

Specializing in Power Query Formula Language (M)

View solution in original post

Hi @Anonymous

 

Please see the attached file

Using your Sample Data

 

400.png

 

Here are the steps

 

Step#1: RANK by time

 

Add a calculated column which will RANK based on TIME column

 

RANK =
RANKX ( TableName, TableName[Time],, asc, DENSE )

 

Step 2: Identify Starting and End Points for "X"

 

Using this calculated Column

 

Previous/Next Status Is X =
IF (
    TableName[Status] = "X"
        && CALCULATE (
            VALUES ( TableName[Status] ),
            FILTER ( ALL ( TableName ), TableName[RANK] = EARLIER ( TableName[RANK] ) - 1 )
        )
            <> "X",
    "Starting Point",
    IF (
        TableName[Status] = "X"
            && CALCULATE (
                VALUES ( TableName[Status] ),
                FILTER ( ALL ( TableName ), TableName[RANK] = EARLIER ( TableName[RANK] ) + 1 )
            )
                <> "X",
        "End Point"
    )
)

Step# 3: Compute the Time Difference

 

Diff =
IF (
    TableName[Previous/Next Status Is X] = "End Point",
    DATEDIFF (
        MAXX (
            FILTER (
                TableName,
                TableName[RANK] < EARLIER ( TableName[RANK] )
                    && TableName[Previous/Next Status Is X] = "Starting Point"
            ),
            TableName[Time]
        ),
        TableName[Time],
        SECOND
    )
)

 


Regards
Zubair

Please try my custom visuals

View solution in original post

20 REPLIES 20

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.