Можете да използвате 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
, така че трябва да предавате своя параметър за минимална дата И интервал по веднъж.