Рассчитать MTBF с помощью SQL-запроса - PullRequest
1 голос
/ 26 июня 2019

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

Я уже нашел подобный вопрос здесь, но он мне не помог.

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

Это мой стол:

|       Failure        |    Start_Repair      |    End_Of_Repair     | Line  | Piece  |
|----------------------|----------------------|----------------------|-------|--------|
| 2019-06-26 06:30:00  | 2019-06-26 10:40:00  | 2019-06-27 12:00:00  | A     | tube   |
| 2019-06-28 00:10:00  | 2019-06-28 02:40:00  | 2019-06-29 01:12:00  | A     | washer |
| 2019-06-30 10:10:00  | 2019-06-30 02:40:00  | 2019-07-01 00:37:00  | B     | bolt   |
| 2019-07-02 12:01:00  | 2019-07-02 14:24:00  | 2019-07-05 00:35:00  | B     | engine |

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

Это SQL-код, который я написал, он не работает ...

SELECT ROW_NUMBER() over (ORDER BY t1.Line, t1.Failure ASC) AS 'Row',
(DATEDIFF(HOUR, T1.failure, T2.failure))/'Row' AS '[MTBF]'
From Test_Failure as t1, Test_Failure as t2
where t1.Failure < t2.Failure

Ошибка: Ошибка преобразования при преобразовании значения varchar 'Row' в тип данных int.

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

A = (41,6 + 198,96) / 2 = 120 ч

B = (49,85 + 116,35) / 2 = 83,1 ч

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Преобразование не удалось при преобразовании значения varchar 'Row' в тип данных внутр.

Вы получили эту ошибку, потому что вы поместили одинарные кавычки вокруг псевдонима первого столбца, а затем попытались использовать его в расчете второго столбца. Вы не можете этого сделать.

Эта строка:

(DATEDIFF(HOUR, T1.failure, T2.failure))/'Row' AS '[MTBF]'

пытается разделить результат DATEDIFF (целое число) на слово «Row» (строка). Вы не можете разделить число на слово.

Для чего бы это ни стоило, даже если вы не использовали одинарные кавычки, вы все равно не можете использовать псевдоним столбца в расчете другого столбца.

0 голосов
/ 26 июня 2019

Если я правильно понимаю, вы можете сделать это с помощью агрегации:

select line,
       datediff(hour, min(failure), max(failure)) / nullif(count(*) - 1, 0)
from test_failure f
group by line;

То есть среднее время между сбоями - это самый последний сбой минус самый ранний, деленный на единицу меньше, чем количество.

...