MySQL Query用于获取每小时的计数

时间:2011-06-08 00:10:46

标签: mysql

我需要计算每小时发生的行动次数。

我的数据库按行动的时间戳记录日志。

我明白我可以做一个

SELECT table.time COUNT(table.time) from table t group by t.time

但是,有一段时间没有采取任何行动。例如,如果我在上午8:00有10个操作,上午9:00没有操作,上午10:00有4个操作,

该查询将返回:

8:00    10
10:00   4

上午9:00跳过,因为它没有条目。

如何进行将考虑0计数条目的查询。

我还需要按星期几来对条目进行相同的查询,但我认为通过回答第一个问题我可以轻松处理另一个问题。

提前致谢!

2 个答案:

答案 0 :(得分:4)

您可以通过创建将包含小时(00:00,01:00等)24个值的表解决这个问题,进行左(或右)与它和你的表允许空值加入让你将有全部24个行即使你的表包含0行,那么group by应该可以正常工作。

当你执行连接时不要忘记截断表格中的所有内容,因此你调用的函数的结果是&执行join on可以等于此帮助表的值。

在使用24个test_time值填充testtime表后,您可以使用以下查询来完成工作

select test_time,sum(sign(coalesce(idFromYourTable,0))) as count from testtime 
left join yourTable on test_time=hour(yourTableTime) 
group by test_time

这将提供0作为计数,如果没有匹配的来自测试表行值,而具有COUNT(*)将提供1秒,而不是0 24行,即使你的表为空,也如果在仅1行你的表是不可能区分0行之间的差异导致结果对于跟随2个不同的行看起来相同

  

23 NULL
  23 1

因为两者都提供相同的结果行计数等于1,而sum技术以不同的方式处理这些行

答案 1 :(得分:1)

在不创建任何表的情况下执行相同操作的简单方法如下

SELECT 
HOUR(time) 'hr', COUNT(DISTINCT id) 
FROM schema.table 
WHERE time BETWEEN '2016-01-23 00:00:00' AND '2016-01-24 00:00:00'
GROUP BY hr;

mysql中的小时函数给出了日期时间或时间戳数据类型的小时。此查询基于具有日期范围的特定小时对它们进行分组。区别不是强制性的,但如果您在每小时的时间范围内寻找唯一的订单或ID。这是查询。