如何按时间分组,如果mysql中没有数据计数为零



sql查询是

select substring(InputTime, 1, 13) as Time, count(*) as count from DB group by hour(InputTime);

然后它出来


+---------------+-------+
| Time          | count |
+---------------+-------+
| 2021-06-15 01 |    11 |
| 2021-06-15 02 |    22 |
| 2021-06-15 04 |    22 |
+---------------+-------+

但我想


+---------------+-------+
| Time          | count |
+---------------+-------+
| 2021-06-15 01 |    11 |
| 2021-06-15 02 |    22 |
| 2021-06-15 03 |    0  |
| 2021-06-15 04 |    22 |
| 2021-06-15 05 |    0  |
...
...
...
...
...
+---------------+-------+

所以我想用零值来填充空计数。如何编辑我的查询?

  1. 首先,您的查询可以用一种更简单的方式表示为:

选择COUNT(*(作为totalCalls,HOUR(end(作为HourFROM调用数据表cINNER JOIN产品p ON c.company=p.numberAND p.id IN(@PRODUCTS(年(end(=@_年和月(end(=@_MONTH按小时分组(end(为HourHourASC 订购

  1. 使用@NoDisplayName在他们的答案中提出的想法:

CREATE TABLE hours_TABLE(hours INT(;

INSERT INTO hours_table VALUES(0(,(1(,(2(,/*将缺失的值放在此处*/(23(;

  1. 您可以加入包含小时数的表以获得所需结果:

选择COUNT(*(作为totalCalls,h.hours作为HourFROM调用数据表cINNER JOIN产品p ON c.company=p.numberRIGHT JOIN hours_table h ON h.hours=HOUR(c.end(AND p.id IN(@PRODUCTS(年(end(=@_年和月(end(=@_MONTH按小时分组按小时ASC 订购

  1. 如果它运行得太慢(我相信它非常慢(,你应该研究一种方法,在"2015-01-01 00:00:00"one_answers"2015-01-31 23:59:59"之间使用end,而不是比较YEAR(end(和MONTH(end(。

  2. 它可以这样完成:

SET@start=STR_TO_DATE(CONCAT(@_YEAR,'-',@_MONTH,'-01 00:00:00'(,'%Y-%m-%d%H:%i:%s'(;SET@end=DATE_SUB(DATE_ADD(@start,间隔1个月(,间隔1秒(;

选择。。。。。。在@start和@end之间与end

  1. 但是这个改变本身并没有帮助。它需要一个场端索引来实现所需的速度提高:

ALTER TABLE调用DataTable ADD INDEX(结束(;

  1. 在联接条件中使用HOUR(c.end(是运行缓慢的另一个原因

它可以通过将表hours_table与第一个查询(的简化版本(产生的结果集连接来改进:

选择IFNULL(totalCall,0(AS totalCalls,h小时ASHourFROM小时数_表h左联接(选择COUNT(*(作为totalCalls,HOUR(end(作为HourFROM调用数据表cINNER JOIN产品p ON c.company=p.numberAND p.id IN(@PRODUCTS(年(end(=@_年和月(end(=@_MONTH按小时分组(end(为Hour)d开启h小时=dHour按小时ASC 订购

最新更新