需要帮助通过失效查询获取已用时间才能正常工作

时间:2016-07-27 11:59:30

标签: mysql

我需要帮助才能使查询正常工作,而且我无法对其进行概念化。通常我希望得到计算机升级到新操作系统所需的时间,减去由故障引起的任何时间段。

该表的示例如下:

timestamp                 -  status

2016-07-19 14:25:59.000    Conversion In Progress
2016-07-20 07:38:20.000    Failed - 04
2016-07-26 07:15:59.000    Conversion In Progress
2016-07-26 08:50:39.000    Conversion Successful

您可以看到转换最初失败时以及再次启动转换时存在很大差距。我想避免为报告目的添加这段时间。

我现在使用的查询是:

 SELECT ROUND( AVG((b.ts - a.ts) / 60), 0)
FROM
(
SELECT mach_name, timestamp, UNIX_TIMESTAMP(timestamp)as ts FROM w10_migration_log where status = 'Conversion In Progress' 
)a INNER JOIN
(
SELECT mach_name, timestamp, UNIX_TIMESTAMP(timestamp)as ts FROM w10_migration_log where status = 'Conversion Successful'
) b on a.mach_name = b.mach_name

日志中的大多数条目都没有问题需要处理。那会有关系吗?

非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

您无法概念化查询并不奇怪,因为您的表结构不适用于此类查询。所以你需要从构建正确的表结构开始。

正在尝试实现的目标的正确结构将是:

| attempt_number | device | started_at | finished_at | status (success or failure) |

因此,您的查询非常简单:您可以为每个(或给定的)计算机的每次尝试计算finished_atstarted_at之间的时差总和。

现在我们已经想出了这个,最好的方法是构建一个临时表或类似于该结构的视图(或者更好,重构你的表),然后简单地从中查询。

或多或少像这样的查询将构建我们想要的视图:

SELECT start.mach_name, start.timestamp as started_at, stop.timestamp as finished_at
FROM w10_migration_log start
join w10_migration_log stop ON stop.timestamp > start.timestamp and stop.mach_name = start.mach_name
where start.status = 'Conversion In Progress'
group by start.timestamp;

然后非常简单地从中选择:

select SEC_TO_TIME(SUM(UNIX_TIMESTAMP(finished_at) - UNIX_TIMESTAMP(started_at)))
FROM (
   /* directly the previous query, or a view made from the previous query */
);

我做了一个快速测试,并获得了18:47:01数据样本。