我正在编写此SQL查询,该查询返回过去24小时在一小时内创建的记录数。我仅获得那些非零值的小时的结果。如果未创建任何记录,则根本不返回任何内容。
这是我的查询:
SELECT HOUR(timeStamp) as hour, COUNT(*) as count
FROM `events`
WHERE timeStamp > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY HOUR(timeStamp)
ORDER BY HOUR(timeStamp)
当前查询的输出:
+-----------------+----------+
| hour | count |
+-----------------+----------+
| 14 | 6 |
| 15 | 5 |
+-----------------+----------+
但是我期望在0小时内不会创建任何记录。我要去哪里错了?
答案 0 :(得分:3)
一种解决方案是生成一个从0到23的数字表,并将其与原始表连接起来。
这是一个使用递归查询生成小时列表的查询(如果您正在运行MySQL,则需要8.0版):
with hours as (
select 0 hr
union all select hr + 1 where h < 23
)
select h.hr, count(e.eventID) as cnt
from hours h
left join events e
on e.timestamp > now() - interval 1 day
and hour(e.timestamp) = h.hr
group by h.hr
如果您的RDBMS不支持递归CTE,则一种选择是使用显式派生表:
select h.hr, count(e.eventID) as cnt
from (
select 0 hr union all select 1 union all select 2 ... union all select 23
) h
left join events e
on e.timestamp > now() - interval 1 day
and hour(e.timestamp) = h.hr
group by h.hr