2015-07-21 228 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 –