Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
5 years ago
Solved

Help for calculating overlapping periods

Guys, I have a relatively complicated task, I need to calculate some maintenance indicators (Downtime and Availability). The problem is that there are overlapping failures, where I can't perform thes...
  • v-kelly-msft's avatar
    v-kelly-msft
    5 years ago

    Hi  Anonymous ,

     

    First create an index column;

    Then create 3 columns below:

    Mark =
    VAR _previousend =
        CALCULATE (
            MAX ( 'Table'[End_failure] ),
            FILTER (
                'Table',
                'Table'[Equipament] = EARLIER ( 'Table'[Equipament] )
                    && 'Table'[Index]
                        = EARLIER ( 'Table'[Index] ) - 1
            )
        )
    RETURN
        IF ( 'Table'[Start_failure] < _previousend, 1, 0 )
    
    Downtime =
    VAR _minindex =
        CALCULATE (
            MIN ( 'Table'[Index] ),
            FILTER ( 'Table', 'Table'[Equipament] = EARLIER ( 'Table'[Equipament] ) )
        )
    VAR _nextmark1 =
        CALCULATE (
            MAX ( 'Table'[Mark] ),
            FILTER (
                'Table',
                'Table'[Index] = _minindex + 1
                    && 'Table'[Equipament] = EARLIER ( 'Table'[Equipament] )
            )
        )
    VAR _index1 =
        CALCULATE (
            MAX ( 'Table'[Index] ),
            FILTER (
                'Table',
                'Table'[Equipament] = EARLIER ( 'Table'[Equipament] )
                    && 'Table'[Index] < EARLIER ( 'Table'[Index] )
                    && 'Table'[Mark] = 0
            )
        )
    VAR _start =
        CALCULATE (
            MAX ( 'Table'[Start_failure] ),
            FILTER (
                'Table',
                'Table'[Index] = _index1
                    && 'Table'[Equipament] = EARLIER ( 'Table'[Equipament] )
            )
        )
    VAR _nextmark2 =
        CALCULATE (
            MAX ( 'Table'[Mark] ),
            FILTER (
                'Table',
                'Table'[Equipament] = EARLIER ( 'Table'[Equipament] )
                    && 'Table'[Index]
                        = EARLIER ( 'Table'[Index] ) + 1
            )
        )
    RETURN
        IF (
            'Table'[Mark] = 0,
            IF (
                _nextmark1 = 0,
                DATEDIFF ( 'Table'[Start_failure], 'Table'[End_failure], DAY ),
                IF ( _nextmark1 = 1, 0 )
            ),
            IF (
                'Table'[Mark] = 1,
                IF (
                    _nextmark2 = 0,
                    DATEDIFF ( _start, 'Table'[End_failure], DAY ),
                    IF ( _nextmark2 = 1, 0 )
                )
            )
        )
    
    Availability =
    VAR _Worktime =
        DATEDIFF ( 'Table'[Start_work], TODAY (), DAY )
    VAR _downtime =
        SUMX (
            FILTER ( 'Table', 'Table'[Equipament] = EARLIER ( 'Table'[Equipament] ) ),
            'Table'[Downtime]
        )
    RETURN
        1 - DIVIDE ( _downtime, _Worktime )
    

     

    And you will see:

    For the related .pbix file,pls see attached.

     

    Best Regards,
    Kelly

    Did I answer your question? Mark my reply as a solution!