按时间段分组仅显示非零总计

时间:2011-04-21 17:38:27

标签: mysql group-by timestamp

我正在做一个mysql查询来计算每分钟的条目数并绘制结果图。结果输出仅显示金额不为零的时间戳。这导致我的图形提供不正确的结果作为在两点之间划线的时间间隙。我想返回每分钟和值的数量。

有没有办法构建此查询而无需循环并执行多个查询?或者,如果我需要一个循环,有一种简单的方法可以在两个时间戳之间循环每一分钟吗?

这是我的疑问:

SELECT UNIX_TIMESTAMP(timestamp) AS timestamp, count(*) AS total  
FROM table  
WHERE timestamp <= '2011-04-22 11:00' AND timestamp >= '2011-04-20 10:00'  
GROUP BY MINUTE(timestamp)

2 个答案:

答案 0 :(得分:0)

您要做的是使用“计数”或“数字”表。基本上,您创建一个具有一个整数列的表,其中数字从1递增到非常高的数字。因此,如果计数表有1000条记录,则表中的数字从1到1000。你想要把更多的数字放在1000以上,但希望你能得到这个想法。

获得计数表后(单击here获取脚本),您可以在查询中选择numtablevalue介于1和enddate - startdate之间(以分钟为单位)。然后按startdate + numtablevalue分组。

这样的事情(伪SQL)应该有效:

SELECT 'startdate' + INTERVAL tt.id MINUTE, COUNT(t1.timestampfield)
FROM tallytable AS tt
INNER JOIN
table AS t1
ON 'startdate' + INTERVAL tt.id MINUTE = t1.timestampfield
WHERE
tt.id BETWEEN 1 AND GETMINUTES('enddate' - 'begindate')
GROUP BY 'startdate' + INTERVAL tt.id MINUTE

基本上我们选择的数字从1到两个日期之间的秒数。然后我们使用startdate + tt.id来获取日期之间的每一秒。然后我们加入并对其进行分组,以查找t1中使用数字表选择的每分钟记录的数量。我希望这是有道理的。

您可能需要注意以下几点:

  • 这将获得时间&gt; startdate(而不是&gt; = startdate)
  • 如果您的时间戳与他们相关联的秒数,请注意5:12 PM可能不等于5:12:30 PM

答案 1 :(得分:0)

select i.`minute`,count(minute(timestamp)) as total from (
select tmp.digit + tmp2.digit * 10 as `minute`
from (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5 union all 
select 6 union all 
select 7 union all 
select 8 union all 
select 9
) as tmp
cross join (
select 0 as digit union all 
select 1 union all 
select 2 union all 
select 3 union all 
select 4 union all 
select 5
) as tmp2 ) as i
left join table
on minute(tb.timestamp) = i.`minute`
and timestamp between '2011-04-20 10:00' and '2011-04-22 11:00' 
group by i.`minute`

此查询将为您提供60条记录(从0到59的分钟数),每分钟的总数不会创建另一个表来存储整数值。