我有一个如下所示的查询:
SELECT count(*), date_format(created, '%H:%i - %d/%m/%y') as
datecreated
FROM mimesi_realtime.served_clips
where created > NOW() - INTERVAL 48 HOUR
group by date_format(created, '%H - %d/%m/%y')
order by min(created) ASC;
它基本上计算了过去48小时内每小时的数量,并按时间顺序对结果进行排序
问题是在夜间,特别是在22:00到5:00之间没有注册数据,我需要每小时显示0的计数
count(*)位于左栏中 已创建是正确的
a)实际结果:
- 261, 20:00 - 11/04/17
- 133, 21:00 - 11/04/17
- 208, 22:00 - 11/04/17
- 358, 5:00 - 12/04/17
- 489, 6:00 - 12/04/17
b)预期结果:
- 261, 20:00 - 11/04/17
- 133, 21:00 - 11/04/17
- 208, 22:00 - 11/04/17
- 0, 23:00 - 11/04/17
- 0, 24:00 - 11/04/17
- 0, 1:00 - 12/04/17
- 0, 2:00 - 12/04/17
- 0, 3:00 - 12/04/17
- 0, 4:00 - 12/04/17
- 358, 5:00 - 12/04/17
- 489, 6:00 - 12/04/17
我有什么方法可以做到这一点吗?
答案 0 :(得分:1)
您问题的常用解决方案是创建一个日历表,其中包含您希望在报告中显示的所有时间戳。如果您无法创建表格,那么您可以使用内联方法,例如
(
SELECT '2017-11-07 00:00:00' AS ts UNION ALL
SELECT '2017-11-07 01:00:00' UNION ALL
...
SELECT '2017-11-07 23:00:00'
) t
然后将日历表连接到当前表并执行类似的查询:
SELECT
COUNT(t2.created),
DATE_FORMAT(t1.ts, '%H - %d/%m/%y') AS datecreated
FROM calendar t1 -- possibly replace with inline table
LEFT JOIN mimesi_realtime.served_clips t2
ON DATE_FORMAT(t1.ts, '%H - %d/%m/%y') = DATE_FORMAT(t2.created, '%H - %d/%m/%y')
WHERE t1.ts > NOW() - INTERVAL 48 HOUR
GROUP BY DATE_FORMAT(t1.ts, '%H - %d/%m/%y')
ORDER BY MIN(t1.ts)
如果您不想使用日历表,那么另一个选项是使计划的进程每小时写一个虚拟记录。这样可以保证每个时间点都出现在您的表格中。它的缺点是浪费了一些空间和设置它所需的时间。