在MySQL大表中按范围分组

时间:2019-06-18 20:55:30

标签: mysql sql

说我有一个像这样的桌子

    id                      timestamp
    -------------------------------------
    1                       2019-06-15 17:00:00
    2                       2019-06-15 17:01:12
    3                       2019-06-15 17:02:54
    4                       2019-06-15 17:06:23
    5                       2019-06-15 17:10:59

...等等,适用于许多行。

我想编写一个查询,以查找在一定时间范围内(例如一小时)的ID(行)数。我知道我可以这样做以在两个时间戳记中找到计数:

    SELECT COUNT(id)
    FROM table
    WHERE (timestamp
        BETWEEN TIMESTAMP '2019-06-15 17:00:00'
            AND TIMESTAMP '2019-06-15 18:00:00')

但是,这很麻烦,因为我必须为每个连续的时间戳范围运行此查询。有没有一种方法可以编写查询,让我每小时获得ID的数量(17-18、18-19、19-20等),并按范围对它们进行分组?我还需要它连续工作几天。

2 个答案:

答案 0 :(得分:0)

您可以使用派生表列出所需的小时数,然后使用JOIN

SELECT h.hh, COUNT(t.timestamp)
FROM (SELECT '2019-06-15 17:00:00' as hh UNION ALL
      SELECT '2019-06-15 18:00:00' as hh UNION ALL
      SELECT '2019-06-15 19:00:00' as hh UNION ALL
      SELECT '2019-06-15 20:00:00' as hh
     ) h LEFT JOIN
     t
     ON t.timestamp >= h.hh AND t.timestamp < h.hh + INTERVAL 1 HOUR
GROUP BY h.hh

答案 1 :(得分:0)

您可以使用date()提取日期,并使用hour()提取小时和小时数。

SELECT date(timestamp),
       hour(timestamp),
       count(id)
       FROM elbat
       GROUP BY date(timestamp),
                hour(timestamp);