2016-07-27 27 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