2016-05-20 2 views
0

Я пытаюсь вычислить среднее время отказа для каждого актива в таблице рабочих мест. На данный момент я вычисляю следующим образом;Среднее время для расчета сбоя в DAX

Previous ID = CALCULATE(MAX('JobTrackDB Job'[JobId]),FILTER('JobTrackDB Job','JobTrackDB Job'[AssetDescriptionID]=EARLIER('JobTrackDB Job'[AssetDescriptionID]) && 'JobTrackDB Job'[JobId]<EARLIER('JobTrackDB Job'[JobId]))) 

Затем я возвращаю последнее время окончания текущего задания, когда JobStatus равен 7 (закрыто);

Finish Time = CALCULATE(MAX('JobTrackDB JobDetail'[FinishTime]),'JobTrackDB JobDetail'[JobId],'JobTrackDB JobDetail'[JobStatus]=7) 

Тогда я вернуть прежние рабочие места закончить время, когда JobType является 1 (Response, а не сравнивая его с вызовами технического обслуживания);

Previous Finish = CALCULATE(MAX('JobTrackDB Job'[Finish Time]),FILTER('JobTrackDB Job','JobTrackDB Job'[AssetDescriptionID]=EARLIER('JobTrackDB Job'[AssetDescriptionID]) && 'JobTrackDB Job'[Finish Time]<EARLIER('JobTrackDB Job'[Finish Time]) && EARLIER('JobTrackDB Job'[JobTypeID])=1)) 

Затем я вычисляю время между отказами, где также игнорирую ошибочные значения;

Time between failure = IF([Previous Finish]=BLANK(),BLANK(),IF('JobTrackDB Job'[Date Logged]-[Previous Finish]<0,BLANK(),'JobTrackDB Job'[Date Logged]-[Previous Finish])) 

Проблема заключается в том, что иногда расчет использует предыдущие задания на техническое обслуживание, хотя я указал JobTypeID = 1 в фильтре. Кроме того, текущий расчет не учитывает время от начала записи до первой работы для этого актива, а также от последнего задания до сегодняшнего дня. Я почесываю голову, пытаясь понять это.

Любые идеи ???

Спасибо, Brent

+0

У вас на самом деле нет JobType = 1 в любом из вычисленных вами вычетов ... –

+0

Sorry, It похоже, был отрезан. – BrentA

ответ

0

Некоторые базовые меры:

MaxJobID := MAX(Job[JobID]) 

MaxLogDate := MAX (Job[Date Logged]) 

MaxFinishTime := MAX (JobDetail[Finish Time]) 

Промежуточные расчеты:

ClosedFinishTime := CALCULATE ([MaxFinishTime], Job[Status] = 7) 

AssetPreviousJobID := CALCULATE ( 
[MaxJobID], 
FILTER(
    ALLEXCEPT(Job, Table1[AssetDescriptionID]), 
    Job[JobId] < MAX(Table1[JobID]) 
) 
) 

PreviousFinishTime: = CALCULATE ([ClosedFinishTime], 
FILTER(
    ALLEXCEPT(Job, Job[AssetDescriptionID]), 
    Job[JobId] < MAX(Job[JobID]) 
    && Job[JobType] = 1 
) 
) 

FailureTime := IF (
ISBLANK([PreviousFinishTime]), 
0, 
([MaxLogDate]-[PreviousFinishTime]) 
) 

Это должно, по крайней мере, чтобы вы начали. Если вы хотите установить какой-то «первый день», вы можете заменить 0 в FailureTime на calc, например MaxLogDate - [TotalFirstDate], который может быть рассчитанной мерой или константой.

Для чего-то, что не сработало, вы хотите использовать совершенно другую меру, поскольку этот метод основан только на обратном просмотре. Что-то вроде [Days With Last Failure], которое было бы просто (в основном) TODAY() - [ClosedFinishTime]

+0

Спасибо за это! Все работает хорошо до PreviousFinishTime, которое возвращает даты, которые после «текущей» работы. Просто пытаюсь проследить, почему это так ... – BrentA

+0

Вы уверены, что время окончания привязано к JobID? Нет, у JobID 6 есть более поздняя дата окончания, чем Job1D 7 и т. Д.? –

+0

Да. Время окончания привязывается к JobID по ссылке на таблицу JobDetail, которая имеет время окончания. Этот элемент работает, возвращая текущее время окончания работы, но не предыдущее время окончания. JobID 6 может определенно иметь время окончания позже JobID7.Я думаю, что фильтр JobType «потерян» в расчете, поскольку он специально не относится к более раннему фильтру для каждого идентификатора ресурса. Я думаю, что первый фильтр должен действовать, а затем фильтр JobType, но это не то, что происходит. – BrentA

Смежные вопросы