Bạn có thể sử dụng TIMESTAMPDIFF
để nhóm theo khoảng thời gian:
Trong một khoảng thời gian cụ thể của giờ, bạn có thể sử dụng:
SELECT '2012-08-03 00:00:00' +
INTERVAL FLOOR(TIMESTAMPDIFF(HOUR, '2012-08-03 00:00:00', timestamp) / <n>) * <n> HOUR AS start_time,
COUNT(*) AS total
FROM event
WHERE timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time
Thay thế các lần xuất hiện của 2012-08-03 00:00:00
với ngày đầu vào tối thiểu của bạn.
<n>
là khoảng thời gian được chỉ định của bạn tính bằng giờ (mỗi 2
giờ, 3
giờ, v.v.), và bạn có thể làm như vậy trong vài phút:
SELECT '2012-08-03 00:00:00' +
INTERVAL FLOOR(TIMESTAMPDIFF(MINUTE, '2012-08-03 00:00:00', timestamp) / <n>) * <n> MINUTE AS start_time,
COUNT(*) AS total
FROM event
WHERE timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time
Ở đâu <n>
là khoảng thời gian được chỉ định của bạn tính bằng phút (mỗi 45
phút, 90
phút, v.v.).
Hãy chắc chắn rằng bạn đang vượt qua ngày nhập liệu tối thiểu của mình (trong ví dụ này là 2012-08-03 00:00:00
) làm tham số thứ hai cho TIMESTAMPDIFF
.
CHỈNH SỬA: Nếu bạn không muốn lo lắng về việc chọn đơn vị khoảng thời gian nào trong TIMESTAMPDIFF
, thì tất nhiên chỉ cần thực hiện khoảng thời gian theo giây (300 =5 phút, 3600 =1 giờ, 7200 =2 giờ, v.v.)
SELECT '2012-08-03 00:00:00' +
INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, '2012-08-03 00:00:00', timestamp) / <n>) * <n> SECOND AS start_time,
COUNT(*) AS total
FROM event
WHERE timestamp >= '2012-08-03 00:00:00'
GROUP BY start_time
EDIT2: Để giải quyết nhận xét của bạn liên quan đến việc giảm số vùng trong câu lệnh mà bạn phải chuyển vào ngày tham số tối thiểu của mình, bạn có thể sử dụng:
SELECT b.mindate +
INTERVAL FLOOR(TIMESTAMPDIFF(SECOND, b.mindate, timestamp) / <n>) * <n> SECOND AS start_time,
COUNT(*) AS total
FROM event
JOIN (SELECT '2012-08-03 00:00:00' AS mindate) b ON timestamp >= b.mindate
GROUP BY start_time
Và chỉ cần chuyển tham số ngày giờ tối thiểu của bạn một lần vào phần chọn phụ tham gia.
Bạn thậm chí có thể tạo cột thứ hai trong phần chọn phụ tham gia cho khoảng thời gian tính theo giây của mình (ví dụ:3600
) và đặt tên cho cột như secinterval
... sau đó thay đổi <n>
của b.secinterval
, vì vậy bạn chỉ phải chuyển tham số ngày tối thiểu VÀ khoảng thời gian mỗi lần một lần.