Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfragehistogramm für Zeitintervalldaten

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.