Sie können dies tun, indem Sie Gruppieren nach mit der gewünschten Ebene verwenden. Hier ist ein Beispiel mit den von Ihnen angegebenen Daten:
Zuerst das SQL, um die Tabelle zu erstellen und zu füllen. Die ID-Spalte hier ist nicht "erforderlich", aber sie wird empfohlen, wenn die Tabelle groß ist oder Indizes enthält.
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');
So erhalten Sie eine Liste geordneter Paare von Dauer in Minuten und Anzahl von Ereignissen:
Die Abfrage kann dann einfach mit der timestampdiff-Funktion geschrieben werden, wie unten gezeigt:
SELECT
TIMESTAMPDIFF(MINUTE, start, end) as minutes,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)
Die Ausgabe:
minutes numEvents
3 3
5 1
Der erste Parameter in der Auswahl kann einer von FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER oder YEAR sein.
Hier sind einige weitere Beispiele für mögliche Abfragen:
Ereignisse nach Stunde (Bodenfunktion wird angewendet)
SELECT
TIMESTAMPDIFF(HOUR, start, end) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
**Ereignisse nach Stunde mit besserer Formatierung **
SELECT
CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
COUNT(*) AS numEvents
FROM
test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)
Sie können nach einer Vielzahl von Optionen gruppieren, aber das sollte Ihnen auf jeden Fall den Einstieg erleichtern. Die meisten Plotpakete erlauben es Ihnen, beliebige X-Y-Koordinaten anzugeben, sodass Sie sich keine Gedanken über die fehlenden Werte auf der X-Achse machen müssen.
Um eine Liste geordneter Paare von Ereignissen zu einem bestimmten Zeitpunkt zu erhalten (zur Protokollierung): Beachten Sie, dass dies als Referenz dient.
Nun zu den Abfragen. Zuerst müssen Sie auswählen, welches Element Sie für die Gruppierung verwenden möchten. Beispielsweise kann eine Aufgabe länger als eine Minute dauern, sodass Start und Ende in unterschiedlichen Minuten liegen. Bei all diesen Beispielen orientiere ich mich an der Startzeit, da das Ereignis tatsächlich zu dieser Zeit stattfand.
Um Ereigniszahlen nach Minuten zu gruppieren, können Sie eine Abfrage wie diese verwenden:
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);
Beachten Sie, wie dies nach allen Elementen gruppiert wird, beginnend mit dem Jahr, bis zur Minute. Ich habe auch die Minute als Label angezeigt. Die resultierende Ausgabe sieht so aus:
minute numEvents
January 1, 2015 12:00 PM 1
January 1, 2015 12:03 PM 3
Dies sind Daten, die Sie dann mit PHP nehmen und für die Anzeige durch eine der vielen Grafikbibliotheken da draußen vorbereiten könnten, indem Sie die Minutenspalte auf der x-Achse und die numEvents auf der y-Achse zeichnen.
Hier sind einige weitere Beispiele für mögliche Abfragen:
Ereignisse nach Stunde
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);
Ereignisse nach Datum
SELECT
DATE_FORMAT(start, '%M %e, %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);
Ereignisse nach Monat
SELECT
DATE_FORMAT(start, '%M %Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start), MONTH(start);
Veranstaltungen nach Jahr
SELECT
DATE_FORMAT(start, '%Y') as date,
count(*) AS numEvents
FROM test.events
GROUP BY YEAR(start);
Ich sollte auch darauf hinweisen, dass diese Abfragen schnell abgeschlossen werden, wenn Sie einen Index für die Startspalte dieser Tabelle haben, selbst mit Hunderten von Millionen Zeilen.
Hoffe das hilft! Lassen Sie mich wissen, wenn Sie weitere Fragen dazu haben.