Рассчитать MTTF с помощью SQL-запроса - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь рассчитать ожидаемое среднее время между концом ошибки и началом следующего (два отдельных столбца) [MTTF].

MTTF = Среднее время до отказа: этосреднее время от конца ошибки до начала следующего

Я уже задавал подобный вопрос, и мне ответили очень профессионально.Мне нравится этот форум.

Мне нужно вычислить разницу между датами в столбце Failure и в столбце End_Of_Repair для каждой строки -1 (другой столбец), преобразовав его в часы и разделив на числоинтервалы для вычисления среднего времени.

Интервалы = количество строк - 1

Это моя таблица:

Failure                 |Start_Repair            |End_Of_Repair           |Line     |Operator
------------------------|------------------------|------------------------|---------|--------
2019-06-26 06:30:00     |2019-06-26 10:40:00     |2019-06-27 12:00:00     |A        |Mike
2019-06-28 00:10:00     |2019-06-28 02:40:00     |2019-06-29 01:12:00     |A        |Loty
2019-06-30 10:10:00     |2019-06-30 02:40:00     |2019-07-01 00:37:00     |B        |Judy
2019-07-02 12:01:00     |2019-07-02 14:24:00     |2019-07-05 00:35:00     |B        |Judy
2019-07-06 07:08:00     |2019-07-06 15:46:00     |2019-07-07 02:30:00     |A        |Mike
2019-07-07 08:22:00     |2019-07-08 05:19:00     |2019-07-08 08:30:00     |B        |Loty
2019-07-29 04:10:00     |2019-07-29 07:40:00     |2019-07-29 14:00:05     |A        |Judy

Так что я должен сделать разницу в ошибкестолбцы конца ошибки, второй минус первый, третий минус второй и т. д. Разделенные на рассчитанные интервалы (которые являются числом строк-1, поскольку я начинаю со строки 2-строки 1).

В двух словах, среднее значение между двумя таблицами.

Я прилагаю изображение, чтобы сделать идею лучше.

enter image description here

Таким образом, мне придется выполнить седьмую строку столбца сбоя минус шестую строку столбца end_of_repair, шестую строку сбоя минус пятую строку столбца end_of_repair и так далее, пока вы не доберетесь до первого.

Я думал:

SELECT line,
DATEDIFF(hour, min(End_Of_Repair), max (Failure)) /  nullif(count(*) - 1, 0) as 'intervals'
from Test_Failure
group by line

Но результаты таковы:

A = 253
B = 76

Результат должен вернуться

A = (12,1 + 173, 93 + 529,6) / 3 = 238 ч

B = (35,4 + 55,78) / 2 = 45,59 ч

1 Ответ

1 голос
/ 27 июня 2019

Одним из методов будет использование LAG для получения значения из предыдущей строки;тогда вы можете усреднить разницу в часах между двумя значениями:

WITH CTE AS(
    SELECT V.Failure,
           V.Start_Repair,
           V.End_Of_Repair,
           V.Line,
           V.Operator,
           LAG(V.End_Of_Repair) OVER (PARTITION BY V.Line ORDER BY V.Failure) AS LastRepair
    FROM (VALUES('2019-06-26T06:30:00','2019-06-26T10:40:00','2019-06-27T12:00:00','A ','Mike'),
                ('2019-06-28T00:10:00','2019-06-28T02:40:00','2019-06-29T01:12:00','A ','Loty'),
                ('2019-06-30T10:10:00','2019-06-30T02:40:00','2019-07-01T00:37:00','B ','Judy'),
                ('2019-07-02T12:01:00','2019-07-02T14:24:00','2019-07-05T00:35:00','B ','Judy'),
                ('2019-07-06T07:08:00','2019-07-06T15:46:00','2019-07-07T02:30:00','A ','Mike'),
                ('2019-07-07T08:22:00','2019-07-08T05:19:00','2019-07-08T08:30:00','B ','Loty'),
                ('2019-07-29T04:10:00','2019-07-29T07:40:00','2019-07-29T14:00:05','A ','Judy'))V(Failure, Start_Repair, End_Of_Repair, Line, Operator))
SELECT CTE.Line,
       AVG(DATEDIFF(HOUR, CTE.LastRepair, CTE.Failure)) AS FaultHours
FROM CTE
GROUP BY CTE.Line;
...