Du kan göra detta med hjälp av grupp efter med den nivå du vill ha. Här är ett exempel som använder den information du angav:
Först SQL för att skapa tabellen och fylla i den. ID-kolumnen här "behövs inte" men det rekommenderas om tabellen är stor eller har index på sig.
CREATE TABLE `test`.`events` (
`id` INT NOT NULL AUTO_INCREMENT,
`user` INT NULL,
`start` DATETIME NULL,
`end` DATETIME NULL,
`type` VARCHAR(45) NULL,
PRIMARY KEY (`id`));
INSERT INTO events (user, start, end, type) VALUES
(1, '2015-1-1 12:00:00', '2015-1-1 12:03:59', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'browsing'),
(2, '2015-1-1 12:03:00', '2015-1-1 12:06:00', 'eating'),
(3, '2015-1-1 12:03:00', '2015-1-1 12:08:00', 'browsing');
För att få en lista över ordnade par av antal minuter varaktighet till antal händelser:
Frågan kan sedan enkelt skrivas med funktionen timestampdiff, som visas nedan:
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
Utdata:
minutes numEvents
3 3
5 1
Den första parametern i valet kan vara en av FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER eller YEAR.
Här är några fler exempel på frågor du kan göra:
Händelser per timme (golvfunktion tillämpas)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Händelser per timme med bättre formatering **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Du kan gruppera efter en mängd olika alternativ, men detta bör definitivt komma igång. De flesta plottningspaket låter dig ange godtyckliga x y-koordinater, så du behöver inte oroa dig för de saknade värdena på x-axeln.
För att få en lista över ordnade par med antal händelser vid en specifik tidpunkt (för loggning): Observera att detta lämnas som referens.
Nu till frågorna. Först måste du välja vilken artikel du vill använda för grupperingen. Till exempel kan en uppgift ta mer än en minut, så början och slutet skulle vara på olika minuter. För alla dessa exempel utgår jag från starttiden, eftersom det var då händelsen faktiskt ägde rum.
För att gruppera händelseräkningar per minut kan du använda en fråga som denna:
SELECT
DATE_FORMAT(start, '%M %e, %Y %h:%i %p') as minute,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start), MINUTE(start);
Notera hur detta grupperar efter alla poster, börjar med år, går på minut. Jag har också minuten visad som en etikett. Resultatet ser ut så här:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Det här är data som du sedan kan ta med hjälp av php och förbereda den för visning i ett av de många grafiska biblioteken där ute, rita minutkolumnen på x-axeln och plotta numEvents på y-axeln.
Här är några fler exempel på frågor du kan göra:
Händelser per timme
SELECT
DATE_FORMAT(start, '%M %e, %Y %h %p') as hour,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start), HOUR(start);
Händelser efter datum
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Händelser per månad
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Händelser efter år
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Jag bör också påpeka att om du har ett index i startkolumnen för den här tabellen, kommer dessa frågor att slutföras snabbt, även med hundratals miljoner rader.
Hoppas det här hjälper! Låt mig veta om du har några andra frågor om detta.