Forum Discussion
This calculated column makes everything slow
Note that Greg's measure will have similar performance issues (compared with the calculated column) but using it instead of a calculated column will keep you from needing to recalculate it each time you edit your model.
Using the new OFFSET function, here's a version that's about 30x faster (~6 ms vs ~180 ms) according to my testing against the pbix attached to the post I linked. It should be much better for large models as well as more dynamically adaptable to various filters (plus it only needs to calculate over all selected data rather than the entire fact table).
MTBF (Hours) AO =
VAR _Summary_ =
CALCULATETABLE (
SUMMARIZE (
Repairs,
Repairs[MachineName],
Repairs[RepairStarted],
Repairs[RepairCompleted]
),
KEEPFILTERS ( Repairs[RepairType] <> "PM" )
)
VAR _AddNext_ =
ADDCOLUMNS (
_Summary_,
"@NextRepair",
SELECTCOLUMNS (
OFFSET (
1,
_Summary_,
ORDERBY ( Repairs[RepairStarted] ),
PARTITIONBY ( Repairs[MachineName] )
),
"RepairStarted", [RepairStarted]
)
)
VAR _Uptime_ =
ADDCOLUMNS (
_AddNext_,
"@Uptime",
DATEDIFF (
[RepairCompleted],
COALESCE ( [@NextRepair], NOW () ),
SECOND
)
)
RETURN
AVERAGEX ( _Uptime_, [@Uptime] ) / 3600Wow, thanks for the extensive reply, I will look into it tonight.
Using the calculated column and the measure I get different results:
Even the calculated column has some weird values. Look at the 5 and 6th rows, the MTBF should be 0, not 2283hours which is the MTBF between the 7 and 6th row. Any ideas?
- Greg_Deckler3 years agoCommunity Champion
some1else It's going to be extremely difficult to troubleshoot this without some sample data as text and your measure formula.
- some1else3 years agoHelper II
Sample data at the end. I want to look at just one specific code "A1".
If you look at the sample, by the measure only method all calculations are wrong. By the calculated column way, Machine1 seems to have the proper MTBF, but Machine2 is way off...Calculated column has this code:
Uptime = VAR next = MINX ( FILTER ( 'TABLE', 'TABLE'[Machine] = EARLIER ( 'TABLE'[Machine] ) && 'TABLE'[actstart] > EARLIER ( 'TABLE'[actstart] ) && 'TABLE'[failurecode] = "A1" ), 'TABLE'[actstart] ) RETURN IF ( 'TABLE'[failurecode] <> "A1", 0, IF ( ISBLANK ( next ), DATEDIFF ( 'TABLE'[actfinish], NOW (), SECOND ), DATEDIFF ( 'TABLE'[actfinish], next, SECOND ) ) )
Measure has this code:MTBF (Hours) = DIVIDE(SUM('TABLE'[Uptime]),[Repairs],BLANK())/3600
By the Measure only method this is the code:MTBF (Hours) Measure = VAR __table = 'TABLE' VAR __table1 = ADDCOLUMNS(__table,"__next", MINX( FILTER(__table, 'TABLE'[Machine]=EARLIER('TABLE'[Machine]) && 'TABLE'[Machine] = EARLIER ( 'TABLE'[Machine] ) && 'TABLE'[failurecode]="A1" ), 'TABLE'[actstart] ) ) VAR __table2 = ADDCOLUMNS(__table1,"__uptime", IF('TABLE'[failurecode]<>"A1", 0, IF(ISBLANK([__next]), DATEDIFF('TABLE'[actfinish],NOW(),SECOND), DATEDIFF('TABLE'[actfinish],[__next],SECOND) ) ) ) VAR __repairs = CALCULATE(COUNTROWS('TABLE'),FILTER(ALLSELECTED('TABLE'),'TABLE'[failurecode]="A1")) RETURN DIVIDE(SUMX(__table2,[__uptime]),__repairs,BLANK())/3600
Sample: