我需要帮助才能使查询正常工作,而且我无法对其进行概念化。通常我希望得到计算机升级到新操作系统所需的时间,减去由故障引起的任何时间段。
该表的示例如下:
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
日志中的大多数条目都没有问题需要处理。那会有关系吗?
非常感谢任何帮助
答案 0 :(得分:0)
您无法概念化查询并不奇怪,因为您的表结构不适用于此类查询。所以你需要从构建正确的表结构开始。
正在尝试实现的目标的正确结构将是:
| attempt_number | device | started_at | finished_at | status (success or failure) |
因此,您的查询非常简单:您可以为每个(或给定的)计算机的每次尝试计算finished_at
和started_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
数据样本。