使用 SQL 查询计算 MTTF
Calculate MTTF with SQL query
我正在尝试计算故障结束与下一个故障开始之间的预期平均时间(两个单独的列)[MTTF]。
MTTF = 平均无故障时间:
是一个故障结束到下一个故障开始的平均时间
我已经问过类似的问题,并且得到了非常专业的回答。我喜欢这个论坛。
我必须计算每行 -1(另一列)的失败列和 End_Of_Repair 列中的日期之间的差异,将其转换为小时并将其除以间隔数计算平均时间。
间隔 = 行数 - 1
这是我的 table:
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 行)开始。
简而言之,两个 table 之间的平均交叉。
我附上图片以使想法更好。
所以我必须做失败列的第七行减去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 = 238h
B = (35,4 + 55,78) / 2 = 45,59h
一种方法是使用LAG
从上一行中获取值;然后你可以平均这 2 次之间的小时差:
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;
我正在尝试计算故障结束与下一个故障开始之间的预期平均时间(两个单独的列)[MTTF]。
MTTF = 平均无故障时间: 是一个故障结束到下一个故障开始的平均时间
我已经问过类似的问题,并且得到了非常专业的回答。我喜欢这个论坛。
我必须计算每行 -1(另一列)的失败列和 End_Of_Repair 列中的日期之间的差异,将其转换为小时并将其除以间隔数计算平均时间。
间隔 = 行数 - 1
这是我的 table:
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 行)开始。
简而言之,两个 table 之间的平均交叉。
我附上图片以使想法更好。
所以我必须做失败列的第七行减去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 = 238h
B = (35,4 + 55,78) / 2 = 45,59h
一种方法是使用LAG
从上一行中获取值;然后你可以平均这 2 次之间的小时差:
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;