Mysql
 sql >> Base de données >  >> RDS >> Mysql

Histogramme de requête MySql pour les données d'intervalles de temps

Vous pouvez le faire en utilisant group by avec le niveau que vous voulez. Voici un exemple utilisant les données que vous avez fournies :

D'abord le SQL pour créer la table et la remplir. La colonne ID ici n'est pas "nécessaire", mais elle est recommandée si la table est volumineuse ou contient des index.

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');

Pour obtenir une liste de paires ordonnées du nombre de minutes de durée au nombre d'événements :

La requête peut ensuite être facilement écrite à l'aide de la fonction timestampdiff, comme indiqué ci-dessous :

SELECT 
    TIMESTAMPDIFF(MINUTE, start, end) as minutes,
    COUNT(*) AS numEvents
FROM
    test.events
GROUP BY TIMESTAMPDIFF(MINUTE, start, end)

La sortie :

minutes      numEvents
3            3
5            1

Le premier paramètre de la sélection peut être FRAC_SECOND, SECOND, MINUTE, HOUR, DAY, WEEK, MONTH, QUARTER ou YEAR.

Voici d'autres exemples de requêtes que vous pouvez effectuer :

Événements par heure (la fonction d'étage est appliquée)

SELECT 
    TIMESTAMPDIFF(HOUR, start, end) as hours,
    COUNT(*) AS numEvents
FROM
    test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)

**Événements par heure avec un meilleur formatage **

SELECT 
    CONCAT("<", TIMESTAMPDIFF(HOUR, start, end) + 1) as hours,
    COUNT(*) AS numEvents
FROM
    test.events
GROUP BY TIMESTAMPDIFF(HOUR, start, end)

Vous pouvez grouper par une variété d'options, mais cela devrait certainement vous aider à démarrer. La plupart des packages de traçage vous permettront de spécifier des coordonnées x y arbitraires, vous n'avez donc pas à vous soucier des valeurs manquantes sur l'axe x.

Pour obtenir une liste de paires ordonnées de nombre d'événements à un moment précis (pour la journalisation) : Notez que cela est laissé pour référence.

Maintenant pour les requêtes. Vous devez d'abord choisir l'élément que vous souhaitez utiliser pour le regroupement. Par exemple, une tâche peut prendre plus d'une minute, de sorte que le début et la fin se situent dans des minutes différentes. Pour tous ces exemples, je les base sur l'heure de début, car c'est à ce moment-là que l'événement a réellement eu lieu.

Pour regrouper le nombre d'événements par minute, vous pouvez utiliser une requête comme celle-ci :

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);

Notez comment cela regroupe tous les éléments, en commençant par l'année, en allant à la minute. J'ai aussi la minute affichée sous forme d'étiquette. La sortie résultante ressemble à ceci :

minute                      numEvents
January 1, 2015 12:00 PM    1
January 1, 2015 12:03 PM    3

Ce sont des données que vous pouvez ensuite prendre en utilisant php et les préparer pour être affichées par l'une des nombreuses bibliothèques graphiques disponibles, en traçant la colonne des minutes sur l'axe des x et en traçant les numEvents sur l'axe des y.

Voici d'autres exemples de requêtes que vous pouvez effectuer :

Événements par heure

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);

Événements par date

SELECT 
    DATE_FORMAT(start, '%M %e, %Y') as date, 
    count(*) AS numEvents 
FROM test.events 
GROUP BY YEAR(start), MONTH(start), DAYOFMONTH(start);

Événements par mois

SELECT 
    DATE_FORMAT(start, '%M %Y') as date, 
    count(*) AS numEvents 
FROM test.events 
GROUP BY YEAR(start), MONTH(start);

Événements par année

SELECT 
    DATE_FORMAT(start, '%Y') as date, 
    count(*) AS numEvents 
FROM test.events 
GROUP BY YEAR(start);

Je dois également souligner que si vous avez un index sur la colonne de départ de cette table, ces requêtes se termineront rapidement, même avec des centaines de millions de lignes.

J'espère que cela t'aides! Faites-moi savoir si vous avez d'autres questions à ce sujet.