如何从表中选择每小时计数,包括缺失的小时数?

Rya*_*yan 6 mysql sql datetime date hour

我希望按小时收集计数。但并不是每个小时都出现在我的表中。

为确保数据始终包含空闲时间,我构建了一个小时表,其中包含 2000-2037 年的日期时间。我想我可以将LEFT JOIN数据表添加到此表中以跟踪丢失的时间。但我需要帮助这样做。

表:date_hour

`hour`
2000-01-01 00:00:00
2000-01-01 01:00:00
...
2036-12-31 23:00:00
Run Code Online (Sandbox Code Playgroud)

my_data

log_date               field1
2015-05-01 00:31:00    1000
2015-05-01 04:19:00    2000    
2015-05-01 05:19:00    1000
2015-05-01 07:19:00    100
2015-05-01 07:35:00    6000
Run Code Online (Sandbox Code Playgroud)

想要的结果:

hour                   count
2015-05-01 00:00:00    1
2015-05-01 01:00:00    0
2015-05-01 02:00:00    0
2015-05-01 03:00:00    0
2015-05-01 04:00:00    1
2015-05-01 05:00:00    1
2015-05-01 06:00:00    0
2015-05-01 07:00:00    2
Run Code Online (Sandbox Code Playgroud)

MySQL尝试:

SELECT
    dh.hour,
    COUNT(md.*) AS count
FROM
    date_hour dh
    LEFT JOIN my_data md ON dh.hour = ????md.log_date????
WHERE
        dh.hour >= '2015-05-01'
    AND dh.hour <  '2015-05-02'
GROUP BY
    dh.hour
ORDER BY
    dh.hour;
Run Code Online (Sandbox Code Playgroud)

完成这些计数的最有效方法是什么?假设每天有 100k-1MM 记录,目标是一次测量至少 30 天的数据。

amd*_*xon 5

可以DATE_FORMAT用来去除分钟和秒,如:

询问

SELECT
    dh.hour,
    COUNT(md.*) AS count
FROM
    date_hour dh LEFT JOIN my_data md 
    ON dh.hour = DATE_FORMAT(md.log_date, "%Y-%m-%d %H:00:00")
WHERE
        dh.hour >= '2015-05-01'
    AND dh.hour <  '2015-05-02'
GROUP BY
    dh.hour
ORDER BY
    dh.hour
;
Run Code Online (Sandbox Code Playgroud)

输出

+------------------------+-----------+
|          hour          |   count   |
+------------------------+-----------+
| 2015-05-01 00:00:00    | 1         |
| 2015-05-01 01:00:00    | 0         |
| 2015-05-01 02:00:00    | 0         |
| 2015-05-01 03:00:00    | 0         |
| 2015-05-01 04:00:00    | 1         |
| 2015-05-01 05:00:00    | 1         |
| 2015-05-01 06:00:00    | 0         |
| 2015-05-01 07:00:00    | 2         |
| ... trailing hours ... | allzeroes |
+------------------------+-----------+
Run Code Online (Sandbox Code Playgroud)

2015-05-01 08:00:00 之后的所有内容都是零( my_data 中没有数据)

sqlfiddle