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 |
...
...
...
...
...
+---------------+-------+
所以我想用零值来填充空计数。如何编辑我的查询?
- 首先,您的查询可以用一种更简单的方式表示为:
选择COUNT(*(作为totalCalls,HOUR(end
(作为Hour
FROM调用数据表cINNER JOIN产品p ON c.company=p.numberAND p.id IN(@PRODUCTS(年(end
(=@_年和月(end
(=@_MONTH按小时分组(end
(为Hour
Hour
ASC 订购
- 使用@NoDisplayName在他们的答案中提出的想法:
CREATE TABLE hours_TABLE(hours INT(;
INSERT INTO hours_table VALUES(0(,(1(,(2(,/*将缺失的值放在此处*/(23(;
- 您可以加入包含小时数的表以获得所需结果:
选择COUNT(*(作为totalCalls,h.hours作为Hour
FROM调用数据表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 订购
-
如果它运行得太慢(我相信它非常慢(,你应该研究一种方法,在"2015-01-01 00:00:00"one_answers"2015-01-31 23:59:59"之间使用end,而不是比较YEAR(end(和MONTH(end(。
-
它可以这样完成:
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
…
- 但是这个改变本身并没有帮助。它需要一个场端索引来实现所需的速度提高:
ALTER TABLE调用DataTable ADD INDEX(结束(;
- 在联接条件中使用HOUR(c.end(是运行缓慢的另一个原因
它可以通过将表hours_table与第一个查询(的简化版本(产生的结果集连接来改进:
选择IFNULL(totalCall,0(AS totalCalls,h小时ASHour
FROM小时数_表h左联接(选择COUNT(*(作为totalCalls,HOUR(end
(作为Hour
FROM调用数据表cINNER JOIN产品p ON c.company=p.numberAND p.id IN(@PRODUCTS(年(end
(=@_年和月(end
(=@_MONTH按小时分组(end
(为Hour
)d开启h小时=dHour
按小时ASC 订购