mysql - 如何按时间分组,如果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 |
...
...
...
...
...
+---------------+-------+
所以我想用零值填充空计数。如何编辑我的查询?
解决方案
- 首先,您的查询可以用更简单的方式表示为:
SELECT COUNT(*) AS totalCalls, HOUR( end
) AS Hour
FROM callsDataTable c INNER JOIN products p ON c.company = p.number AND p.id IN (@_PRODUCTS) AND YEAR( end
) = @_YEAR AND MONTH( end
) = @_MONTH按ASC的
顺序按小时分组(end
)Hour
Hour
- 使用@NoDisplayName 在他们的回答中建议的想法:
CREATE TABLE hours_table(小时 INT);
INSERT INTO hours_table VALUES(0), (1), (2), /* 把缺失值放在这里 */ (23);
- 您可以加入包含小时数的表以获得所需的结果:
SELECT COUNT(*) AS totalCalls, h.hours AS Hour
FROM callsDataTable c INNER JOIN products p ON c.company = p.number RIGHT JOIN hours_table h ON h.hours = HOUR(c. end
) AND p.id IN (@_PRODUCTS) AND YEAR( end
) = @_YEAR AND MONTH( end
) = @_MONTH GROUP BY h.hours ORDER BY h.hours ASC
如果它运行得太慢(而且我确信它非常慢),您应该研究一种使用 end BETWEEN '2015-01-01 00:00:00' AND '2015-01-31 23:59' 之类的方法: 59' 而不是比较 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, INTERVAL 1 MONTH), INTERVAL 1 SECOND);
选择 ... ...end
在 @start 和 @end ... 之间
- 但这种变化本身并没有帮助。它需要一个字段端的索引来带来所需的速度提升:
ALTER TABLE 调用DataTable ADD INDEX(end);
- 在连接条件中使用 HOUR(c.end) 是运行缓慢的另一个原因。
可以通过将表 hours_table 与第一个查询(的简化版本)产生的结果集连接起来来改进它:
SELECT IFNULL(totalCalls, 0) AS totalCalls, h.hours AS Hour
FROM hours_table h LEFT JOIN (SELECT COUNT(*) AS totalCalls, HOUR( end
) as Hour
FROM callsDataTable c INNER JOIN products p ON c.company = p.number AND p. id IN (@_PRODUCTS) AND YEAR( end
) = @_YEAR AND MONTH( end
) = @_MONTH GROUP BY HOUR( end
) AS Hour
) d ON h.hours = d。Hour
ORDER BY h.hours ASC
推荐阅读
- swift - 核心数据插入
- anaconda - 为什么安装anaconda后无法运行?
- java - 对按保持排序的值排序的数组列表进行排序
- python - 向下滚动按钮更改 url django
- python - 使用 Selenium 将多个 URL 下载为 PDF
- python - Apache Spark ALS 算法
- java - 如何在java中的arraylist中添加异常
- python - Tkinter get() 不返回值
- javascript - 为什么我的 JavaScript 无法获取导航对象高度
- javascript - 使用循环向 Firestore 的 get() 添加多个条件,一般 javascript 问题