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
Alasharim
Frequent Visitor

Average out of service days calculated column

hi all,

 

I'm trying to calculate the average out-of-service days for a certain Truck...

 

below is an example of the table I'm dealing with

 

the first three columns are what I have and the last two columns are what I'm trying to calculate

 

DateTruck NoStatusnumber of oos daysnumber of serviceable days
1-JanTruck 1Serviceable 1
2-JanTruck 1Serviceable 2
3-JanTruck 1Serviceable 3
4-JanTruck 1Serviceable 4
5-JanTruck 1Serviceable 5
6-JanTruck 1Serviceable 6
7-JanTruck 1Serviceable 7
8-JanTruck 1Serviceable 8
9-JanTruck 1OOS1 
10-JanTruck 1OOS2 
11-JanTruck 1OOS3 
12-JanTruck 1OOS4 
13-JanTruck 1OOS5 
14-JanTruck 1Serviceable 1
15-JanTruck 1Serviceable 2
16-JanTruck 1OOS1 
17-JanTruck 1OOS2 
18-JanTruck 1OOS3 
19-JanTruck 1Serviceable 1
20-JanTruck 1Serviceable 2
21-JanTruck 1Serviceable 3
22-JanTruck 1OOS1 
23-JanTruck 1OOS2 
24-JanTruck 1OOS3 
25-JanTruck 1Serviceable 1
26-JanTruck 1Serviceable 2
27-JanTruck 1Serviceable 3
28-JanTruck 1OOS1 
29-JanTruck 1OOS2 
30-JanTruck 1Serviceable 1
31-JanTruck 1Serviceable 2

 

 

is it advisable to take the calc column route or a measure is better performance-wise?

 

thank you in advance

1 ACCEPTED SOLUTION

Hi @Alasharim ,

 

You may consider converting calculated columns to measures.

Calculated Columns and Measures in DAX - SQLBI

 

number of oos days_1 = 
VAR _date =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Status] <> "OOS"
                && 'Table'[Date] <= max('Table'[Date])
                && 'Table'[Truck No] = MAX('Table'[Truck No])
        )
    )
VAR _times =
    CALCULATE (
        COUNTROWS ( 'Table' ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Date] <= MAX('Table'[Date])
                && 'Table'[Date] > _date
                && 'Table'[Truck No] =MAX('Table'[Truck No] )
        )
    )
RETURN
    _times
number of serviceable days_1 = 
VAR _date =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Status] <> "Serviceable"
                && 'Table'[Date] <= MAX ( 'Table'[Date] )
                && 'Table'[Truck No] = MAX ( 'Table'[Truck No] )
        )
    )
VAR _times =
    CALCULATE (
        COUNTROWS ( 'Table' ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Date] <= MAX( 'Table'[Date] )
                && 'Table'[Date] > _date
                && 'Table'[Truck No] = MAX( 'Table'[Truck No] )
        )
    )
RETURN
    _times

vcgaomsft_0-1650520894700.png

Attach the PBIX file for reference. Hope it helps.

 

Best Regards,
Community Support Team_Gao

 

If there is any post helps, then please consider Accept it as the solution to help the other members find it more quickly. If I misunderstand your needs or you still have problems with it, please feel free to let us know. Thanks a lot!

How to get your questions answered quickly -- How to provide sample data

View solution in original post

4 REPLIES 4
v-cgao-msft
Community Support
Community Support

Hi @Alasharim ,

 

I use the calculated column.

number of oos days = 
VAR _date =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Status] <> "OOS"
                && 'Table'[Date] <= EARLIER ( 'Table'[Date] )
                && 'Table'[Truck No] = EARLIER ( 'Table'[Truck No] )
        )
    )
VAR _times =
    CALCULATE (
        COUNTROWS ( 'Table' ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Date] <= EARLIER ( 'Table'[Date] )
                && 'Table'[Date] > _date
                && 'Table'[Truck No] = EARLIER ( 'Table'[Truck No] )
        )
    )
RETURN
    _times
number of serviceable days = 
VAR _date =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Status] <> "Serviceable"
                && 'Table'[Date] <= EARLIER ( 'Table'[Date] )
                && 'Table'[Truck No] = EARLIER ( 'Table'[Truck No] )
        )
    )
VAR _times =
    CALCULATE (
        COUNTROWS ( 'Table' ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Date] <= EARLIER ( 'Table'[Date] )
                && 'Table'[Date] > _date
                && 'Table'[Truck No] = EARLIER ( 'Table'[Truck No] )
        )
    )
RETURN
    _times

vcgaomsft_0-1649759605594.png

Attach the PBIX file for reference. Hope it helps.

 

Best Regards,
Community Support Team_Gao

 

If there is any post helps, then please consider Accept it as the solution to help the other members find it more quickly. If I misunderstand your needs or you still have problems with it, please feel free to let us know. Thanks a lot!

How to get your questions answered quickly -- How to provide sample data

i went through your logic and it seems promising thank you.

 

the only issue is that it's taking too long for it to process through my large table.

 

i think a measure would be a more efficient approuch, what do you think?

Hi @Alasharim ,

 

You may consider converting calculated columns to measures.

Calculated Columns and Measures in DAX - SQLBI

 

number of oos days_1 = 
VAR _date =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Status] <> "OOS"
                && 'Table'[Date] <= max('Table'[Date])
                && 'Table'[Truck No] = MAX('Table'[Truck No])
        )
    )
VAR _times =
    CALCULATE (
        COUNTROWS ( 'Table' ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Date] <= MAX('Table'[Date])
                && 'Table'[Date] > _date
                && 'Table'[Truck No] =MAX('Table'[Truck No] )
        )
    )
RETURN
    _times
number of serviceable days_1 = 
VAR _date =
    CALCULATE (
        MAX ( 'Table'[Date] ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Status] <> "Serviceable"
                && 'Table'[Date] <= MAX ( 'Table'[Date] )
                && 'Table'[Truck No] = MAX ( 'Table'[Truck No] )
        )
    )
VAR _times =
    CALCULATE (
        COUNTROWS ( 'Table' ),
        FILTER (
            ALL ( 'Table' ),
            'Table'[Date] <= MAX( 'Table'[Date] )
                && 'Table'[Date] > _date
                && 'Table'[Truck No] = MAX( 'Table'[Truck No] )
        )
    )
RETURN
    _times

vcgaomsft_0-1650520894700.png

Attach the PBIX file for reference. Hope it helps.

 

Best Regards,
Community Support Team_Gao

 

If there is any post helps, then please consider Accept it as the solution to help the other members find it more quickly. If I misunderstand your needs or you still have problems with it, please feel free to let us know. Thanks a lot!

How to get your questions answered quickly -- How to provide sample data

the measure version is much easier to deal with it takes a while for it to load though..

 

especially when coupling it with 

 

Avg OOS Days_M =
AVERAGEX (
    FILTER (
        'Table',
        'Table'[Date] = MAX ( 'Table'[Date] )
            && 'Table'[Status] = "OOS"
    ),
    [# of OOS Days (m)]
)

 

appreciate your thoughts here

 

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.