2015-07-21 227 views
0

我有記錄一個網站的HTTP狀態代碼表每當狀態發生變化,所以表看起來像這樣...計算時間百分比

id status     date 
----------------------------------- 
1  404  2015-10-01 13:30:00 
2  200  2015-10-02 13:30:00 
3  404  2015-10-03 13:30:00 

我想用這個數據來顯示錶在我的網站上顯示每次登錄狀態的次數以及當前狀態的持續時間百分比。

我已經成功地設法獲得使用下面的查詢每種狀態的總數....

SELECT 
    `status`, 
    COUNT(*) AS `status_count` 
FROM `table_name` 
GROUP BY `status` 
ORDER BY `status` 

...執行時給了我這樣的事情...

status status_count 
---------------------- 
200  1 
404  2 

我想修改我的sql添加持續時間到日期列計算的結果,我的目標是以此結束...

status status_count duration (%) 
----------------------------------- 
200  1    20 
404  2    80 
+0

你是如何得到這些持續時間值的?你在做什麼計算? – alariva

+0

問題的持續時間是示例,並且不正確。但是,要計算持續時間......第一個ID(1)是持續時間開始的位置,而當前時間是持續時間結束的位置。數據顯示,該網站在網站狀態更改爲200之前的整整24小時內爲404。然後,網站狀態在更改爲404之前的24小時內爲200. 404是最後記錄的值,因此仍爲當前時間404。 – itsliamoco

+0

所以正確的結果應該是404'66%'和200'33%'? –

回答

2

這裏是SQL FIDDLE DEMO

SELECT t1.status 
     ,COUNT(t1.id) as status_count 
     ,SUM(IF(t2.date IS NULL, NOW(), t2.date)-t1.date)/(NOW()-t3.start_date) as duration 
    FROM table_name t1 
     LEFT JOIN table_name t2 ON t1.id = (t2.id - 1) 
     ,(SELECT MIN(date) as start_date FROM table_name) t3 
GROUP BY t1.status 
+0

我喜歡您的sql,因爲效率更高,但是您返回的結果與我的不同,請您仔細檢查小提琴演示。我使用excel驗證我的。 –

+0

胡安,非常感謝你爲小提琴演示的創作。基於它的數據404是1天(07/01-02)和近18天(07/03-21)。所以它比19天少一點。狀態200爲1天(07/02-03)。所以大致的結果應該是404 - 略少於95%(基於小提琴演示結果的0.9498)和200稍微超過5%(0.0502)。我對嗎? – nick

+0

@nick非常感謝!這是我已經實施的代碼如果我想按日期過濾,該怎麼辦? – itsliamoco

0

使用此查詢

select a.*,(a.status_count/b.tot)*100 as duration_per from (SELECT 
     `status`, 
     COUNT(*) AS `status_count` 
    FROM `table_name` 
    GROUP BY `status` 
    ORDER BY `status`) a join (select count(*) as tot from `table_name`) b 
+0

我認爲你是計算狀態而不是日期 –

+0

是的,我認爲這是@itsliamoco –

+0

和@itsliamoco提供給我們的只有一次。我們如何計算日期時間差異? –

1

礦比缺口更復雜,但給出不同的結果。
我試着用excel來驗證值是否正確。

我開始日期與2015-07-01 13:30:00所以NOW()功能可以工作

意思秒

404 | 86400 1 day | 0.05101 
200 | 86400 1 day | 0.05101 
404 | 1521138 17 days | 0.89799 
total 1693938 

最終結果

404 | 2 | 0.94899 
200 | 1 | 0.05101 

SQL FIDDLE DEMO

SELECT status, Count(status), SUM(secdiff)/MAX(sectotal) as porcentage 
FROM 
(
    SELECT 
     h1.status, 
     h2.dateupdate d1, 
     h1.dateupdate d2, 
     TIMESTAMPDIFF(SECOND,h1.dateupdate, h2.dateupdate) secdiff, 
     TIMESTAMPDIFF(SECOND, 
         (SELECT MIN(dateupdate) from logHttp), 
         NOW()) sectotal 
    FROM 
     logHttp as h1 INNER JOIN 
     (
      (Select * from logHttp) 
      union 
      (select MAX(id) +1, 0, NOW() from logHttp) 
     ) as h2 
     On h1.id + 1 = h2.id  
) as t1 
group by status; 
+0

你的查詢對我所需要的是完美的,但是我的數據表中有更多的列比我的例子中顯示的更多,這會導致以下錯誤:「使用的SELECT語句具有不同數量的列」(http:// sqlfiddle .com /#!9/aed7d/1) – itsliamoco

+0

http://sqlfiddle.com/#!9/aed7d/2我在NOW()上添加另一個0 –