2017-04-25 68 views
0

累积总和我有一个简单的计数器表:获取每小时

date     action  type 
2017-04-25 11:41:38 +1   type_1 
2017-04-25 11:66:22 +1   type_2 
2017-04-25 12:41:32 -1   type_1 
2017-04-25 12:55:38 +1   type_3 
2017-04-25 13:02:11 -1   type_1 

我希望做一个图形,累计参观PR公关每小时类型和跳过那些0。所以,我得到一个图表,每隔一小时在X轴上和在Y轴上访问。然后是四个累积图表,每个类型和一个总数。

到目前为止,我得到了以下声明,只是给出了没有类型的总和小时数。我需要一些帮助来将其发展到上面描述的状态。

SELECT DATE_FORMAT(date, '%W %k:00') as weekday, DATE_FORMAT(date, '%d-%m-%Y %k:00') as full_date, SUM(action) as total 
FROM  counter 
GROUP BY HOUR(date) 

期望的结果:

date     total   type 
2017-04-25 11:00  3    type_1 
2017-04-25 11:00  5    type_2 
2017-04-25 11:00  8    type_3 
2017-04-25 11:00  16   total 
2017-04-25 12:00  6    type_1 
2017-04-25 12:00  9    type_2 
2017-04-25 12:00  14   type_3 
2017-04-25 12:00  29   total 

我认为这会为我提供的数据做所需的图形

+2

用你正在使用的数据库标记你的问题。在问题中提供预期的结果。 –

回答

0

首先,按小时汇总数据:

select date_format(date, '%Y-%m-%d %H') as yyyymmddhh, type, sum(action) as cnt 
from counter 
group by yyyymmddhh, type; 

接下来,您可以使用变量获取累计值:

select yyyymmddhh, type, cnt, 
     (@cs := if(@t = type, @cs + cnt, 
        if(@t := type, cnt, cnt) 
       ) 
     ) as cumulative_cnt 
from (select date_format(date, '%Y-%m-%d %H') as yyyymmddhh, type, sum(action) as cnt 
     from counter 
     group by yyyymmddhh, type 
    ) c cross join 
    (select @t := '', @cs := 0) params 
order by type, yyyymmddhh; 

如果需要按不同顺序输出结果,则将其用作子查询,并将order by置于外部查询中。