2016-07-27 59 views
1

我需要帮忙查询工作,我无法概念化了。通常,我希望获得计算机升级到新操作系统所需的时间,减去由故障引起的任何时间段。表需要帮忙的经过时间的流逝查询工作

例子是:

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

,这并不奇怪,你不能概念化查询,因为你的表结构不适合这种类型的查询。所以你需要从构建正确的表结构开始。

你正在努力实现将是什么正确的结构:

| 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您数据样本。

+0

感谢您的回复。您的帖子很有意义,我没有创建表格,但我可能会看到关于更改它。无论如何,如果日志中有超过2个条目?我们有一些机器失败5,6次以上。这似乎不适用于这种情况。 – spas2k

+0

@ spas2k什么不行?我建议每次尝试一行,所以2或6或20应该完全相同。 – rlanvin