我正在编写这个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。我哪里出问题了?
发布于 2019-12-27 03:15:09
一种解决方案是生成一个从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
https://stackoverflow.com/questions/59499860
复制