我需要计算每小时发生的行动次数。
我的数据库按行动的时间戳记录日志。
我明白我可以做一个
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计数条目的查询。
我还需要按星期几来对条目进行相同的查询,但我认为通过回答第一个问题我可以轻松处理另一个问题。
提前致谢!
答案 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。这是查询。