Можете да използвате TIMESTAMPDIFF
за групиране по интервали от време:
За определен интервал от часове можете да използвате:
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
Заменете поява на 2012-08-03 00:00:00 с минималната ви дата на въвеждане.
<n> е посоченият от вас интервал в часове (всеки 2 часа, 3 часове и т.н.) и можете да направите същото за минути:
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
Където <n> е посоченият от вас интервал в минути (всеки 45 минути, 90 минути и т.н.).
Уверете се, че подавате минималната си дата за въвеждане (в този пример 2012-08-03 00:00:00 ) като втори параметър за TIMESTAMPDIFF .
РЕДАКТИРАНЕ: Ако не искате да се притеснявате коя интервална единица да изберете в TIMESTAMPDIFF функция, след което разбира се просто направете интервала по секунди (300 =5 минути, 3600 =1 час, 7200 =2 часа и т.н.)
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
РЕДАКТИРАНЕ 2: За да адресирате коментара си, отнасящ се до намаляване на броя на областите в изявлението, където трябва да предадете датата на минималния си параметър, можете да използвате:
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
И просто предайте своя минимален параметър за дата и час веднъж в подизбора за присъединяване.
Можете дори да направите втора колона в подизбора за присъединяване за вашия интервал от секунди (напр. 3600 ) и именувайте колоната нещо като secinterval ... след това променете <n> 's към b.secinterval , така че трябва да предавате своя параметър за минимална дата И интервал по веднъж.