Du kan gøre dette ved at bruge gruppe efter med det niveau, du ønsker. Her er et eksempel, hvor du bruger de data, du har givet:
Først SQL'en til at oprette tabellen og udfylde den. ID-kolonnen her er ikke "nødvendig", men det anbefales, hvis tabellen vil være stor eller have indekser på den.
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');
For at få en liste over ordnede par af antal minutter varighed til antal begivenheder:
Forespørgslen kan derefter nemt skrives ved hjælp af timestampdiff-funktionen, som vist nedenfor:
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
Udgangen:
minutes numEvents
3 3
5 1
Den første parameter i valget kan være en af FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER eller YEAR.
Her er nogle flere eksempler på forespørgsler, du kan gøre:
Begivenheder pr. time (gulvfunktion anvendes)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Begivenheder efter time med bedre formatering **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Du kan gruppere efter en række forskellige muligheder, men dette burde helt sikkert få dig i gang. De fleste plottepakker giver dig mulighed for at angive vilkårlige x y-koordinater, så du ikke behøver at bekymre dig om de manglende værdier på x-aksen.
For at få en liste over ordnede par af antal hændelser på et bestemt tidspunkt (til logning): Bemærk, at dette er overladt til reference.
Nu til spørgsmålene. Først skal du vælge, hvilken vare du vil bruge til grupperingen. For eksempel kan en opgave tage mere end et minut, så starten og slutningen ville være i forskellige minutter. For alle disse eksempler baserer jeg dem på starttidspunktet, da det er det tidspunkt, hvor begivenheden faktisk fandt sted.
For at gruppere begivenhedstællinger efter minut, kan du bruge en forespørgsel som denne:
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);
Bemærk, hvordan denne grupperer efter alle punkter, startende med år, gang i minuttet. Jeg har også minuttet vist som en etiket. Det resulterende output ser således ud:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Dette er data, som du derefter kunne tage ved hjælp af php og forberede dem til visning af et af de mange grafiske biblioteker derude, plotte minutkolonnen på x-aksen og plotte numEvents på y-aksen.
Her er nogle flere eksempler på forespørgsler, du kan gøre:
Begivenheder efter time
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);
Begivenheder efter dato
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Begivenheder efter måned
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Begivenheder efter år
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Jeg skal også påpege, at hvis du har et indeks i startkolonnen for denne tabel, vil disse forespørgsler fuldføres hurtigt, selv med hundredvis af millioner af rækker.
Håber dette hjælper! Fortæl mig, hvis du har andre spørgsmål om dette.