使用 SQL 查询计算 MTBF
Calculate MTBF with SQL query
我正在尝试计算故障开始与下一个(同一列)[MTBF] 开始之间的预期平均时间。
我已经在这里找到了类似的问题,但它对我没有帮助。
我必须为每一行(其他列)计算失败列 ((n+1) - n) 中的日期之间的差异,将其转换为小时并将其除以间隔数以计算平均时间。
这是我的 table:
| 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 |
所以我必须在失败列上做出差异,第二减第一,第三减第二,等等。所有除以计算的间隔(这是我从第 2 行开始的第 1 行数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,1h
如果我没理解错的话,你可以通过聚合来做到这一点:
select line,
datediff(hour, min(failure), max(failure)) / nullif(count(*) - 1, 0)
from test_failure f
group by line;
即平均故障间隔时间是最近的故障减去最早的故障除以计数减一。
Conversion failed when converting the varchar value 'Row' to data type
int.
您收到此错误是因为您在第一列别名周围加上了单引号,然后试图在第二列的计算中使用它。你不能那样做。
这一行:
(DATEDIFF(HOUR, T1.failure, T2.failure))/'Row' AS '[MTBF]'
试图将 DATEDIFF 结果(整数)除以单词 "Row"(字符串)。你不能用一个词来除一个数字。
不管怎样,即使你不使用单引号,你仍然
我正在尝试计算故障开始与下一个(同一列)[MTBF] 开始之间的预期平均时间。
我已经在这里找到了类似的问题,但它对我没有帮助。
我必须为每一行(其他列)计算失败列 ((n+1) - n) 中的日期之间的差异,将其转换为小时并将其除以间隔数以计算平均时间。
这是我的 table:
| 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 |
所以我必须在失败列上做出差异,第二减第一,第三减第二,等等。所有除以计算的间隔(这是我从第 2 行开始的第 1 行数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,1h
如果我没理解错的话,你可以通过聚合来做到这一点:
select line,
datediff(hour, min(failure), max(failure)) / nullif(count(*) - 1, 0)
from test_failure f
group by line;
即平均故障间隔时间是最近的故障减去最早的故障除以计数减一。
Conversion failed when converting the varchar value 'Row' to data type int.
您收到此错误是因为您在第一列别名周围加上了单引号,然后试图在第二列的计算中使用它。你不能那样做。
这一行:
(DATEDIFF(HOUR, T1.failure, T2.failure))/'Row' AS '[MTBF]'
试图将 DATEDIFF 结果(整数)除以单词 "Row"(字符串)。你不能用一个词来除一个数字。
不管怎样,即使你不使用单引号,你仍然