2016-05-20 16 views
0

Ich versuche, die mittlere Zeit bis zum Ausfall für jedes Asset in einer Jobtabelle zu berechnen. Im Moment berechne ich wie folgt;Durchschnittliche Zeit bis zur Fehlerberechnung in DAX

Dann bringe ich die letzte Endzeit für den aktuellen Job zurück, wenn der JobStatus 7 (geschlossen) ist;

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

Dann bringe ich die vorherigen Jobs Zeit beenden zurück, wo der Jobtype 1 (Antwort, anstatt es zu Wartungs Anrufen zu vergleichen);

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)) 

Dann berechne ich die Zeit zwischen dem Fehler, wo ich auch falsche Werte ignoriere;

Problem ist, dass manchmal die Berechnung frühere Wartungsaufträge verwendet, obwohl ich JobTypeID = 1 im Filter angegeben habe. Außerdem berücksichtigt die aktuelle Berechnung nicht die Zeit vom Beginn der Datensätze bis zum ersten Job für diesen Asset und auch vom letzten Job bis heute. Ich kratze mich am Kopf und versuche es herauszufinden.

Irgendwelche Ideen ???

Danke, Brent

+0

Sie haben tatsächlich JobType = 1 in keinem der von Ihnen bereitgestellten Berechnungen ... –

+0

Sorry, It scheint abgeschnitten worden zu sein. – BrentA

Antwort

0

Einige Basismaßnahmen:

MaxJobID := MAX(Job[JobID]) 

MaxLogDate := MAX (Job[Date Logged]) 

MaxFinishTime := MAX (JobDetail[Finish Time]) 

Zwischenberechnungen:

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]) 
) 

Das zumindest sollten Sie begonnen erhalten. Wenn Sie eine Art "ersten Tag" festlegen möchten, können Sie die 0 in FailureTime durch eine Berechnung wie MaxLogDate - [OverallFirstDate] ersetzen, bei der es sich um eine berechnete Kennzahl oder eine Konstante handeln kann.

Für etwas, das nicht fehlgeschlagen ist, möchten Sie eine völlig andere Maßnahme verwenden, da diese nur auf Rückschau basiert. Etwas wie [Tage seit dem letzten Fehler], das nur (grundsätzlich) HEUTE wäre() - [ClosedFinishTime]

+0

Danke dafür! Alles funktioniert bis zur PreviousFinishTime, die Daten zurückbringt, die nach dem 'aktuellen' Job liegen. Nur versuchen zu verfolgen, warum das ist ... – BrentA

+0

Sie sind sicher, Endzeit ist an JobID gebunden? Nein, JobID 6 hat ein späteres Enddatum als Job1D 7, etc? –

+0

Ja. Die Endzeit ist über den Link zur JobDetail-Tabelle, die die Endzeiten hat, an JobID gebunden. Dieses Element bewirkt, dass die aktuelle Bearbeitungszeit, aber nicht die vorherige Bearbeitungszeit, zurückkehrt. JobID 6 kann definitiv eine Endzeit später als JobID7 haben. Ich denke, dass der JobType-Filter in der Berechnung "verloren" ist, da er sich nicht spezifisch auf den früheren Filter für jede AssetID bezieht. Ich denke der erste Filter muss wirken und dann der JobType Filter aber das ist nicht was passiert. – BrentA