2010-01-28 39 views
3

我的表結構組的每個條目運行總看起來像這樣...

| 2010-01-28 10:00:01 | Delhi | Application | up  | 
| 2010-01-28 10:00:01 | Delhi | Mysql  | up  | 
| 2010-01-28 10:00:01 | Delhi | LAN   | down | 
| 2010-01-28 10:00:01 | Delhi | WAN   | up  | 
| 2010-01-28 10:15:01 | Delhi | Application | up  | 
| 2010-01-28 10:15:01 | Delhi | Mysql  | up  | 
| 2010-01-28 10:15:01 | Delhi | LAN   | down | 
| 2010-01-28 10:15:01 | Delhi | WAN   | up  | 
| 2010-01-28 10:30:01 | Delhi | Application | up  | 
| 2010-01-28 10:30:01 | Delhi | Mysql  | up  | 
| 2010-01-28 10:30:01 | Delhi | LAN   | up | 
| 2010-01-28 10:30:01 | Delhi | WAN   | up  | 

局域網的停機時間總共爲30分鐘。

| 2010-01-28 10:00:01 | Delhi | LAN   | down | 
| 2010-01-28 10:15:01 | Delhi | LAN   | down | 
| 2010-01-28 10:30:01 | Delhi | LAN   | up | 

有什麼方法可以計算總停機時間我們使用計算運行總計的方式嗎?

回答

1

看來,每個報告期正好是15分鐘,每個應用程序上市,所以快速黑客可以是:

SELECT COUNT(state)*15 as downtime,Application FROM stats WHERE state='down' GROUP BY Application

-1

您需要查看連續的記錄,並且如果先前的記錄是「關閉的」,則計數時間。在SQL Server中,你可以做到這一點。我認爲這是在MySQL

With OrderedRows AS 
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY System ORDER BY StatusTime) AS RowNum 
FROM yourTable 
) 
SELECT o_this.System, 
    SUM(DATEDIFF(second, o_this.StatusTime, o_next.StatusTime)) AS DownTimeSeconds 
FROM OrderedRows o_this 
    JOIN 
    OrderedRows o_next 
    ON o_next.System = o_this.System 
    AND o_next.RowNum = o_this.RowNum + 1 
WHERE o_this.Status = 'down' 
GROUP BY o_this.System; 

沒有排名的功能類似,你可以試試:

SELECT t.System, 
    SUM(DATEDIFF('s', 
     t.StatusTime, 
     (SELECT MIN(t_next.StatusTime) 
     FROM yourTable AS t_next 
     WHERE t_next.System = t.System 
     AND t_next.StatusTime > t.StatusTime 
    ) 
    )) AS DownTimeSeconds 
FROM yourTable as t 
WHERE t.Status = 'down' 
GROUP BY t.System; 

但事件,這可能與它作爲一個總的麻煩通過總計。

+0

MySQL沒有任何排名/解析函數 – 2010-01-28 05:42:23

+0

啊 - 希望不是這樣的... – 2010-01-28 05:58:59

+0

我猜從downvote,第二個也不管用。 – 2010-01-28 20:26:06