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

l'heure la plus active de la journée en fonction de l'heure de début et de fin

Si j'ai bien compris vos besoins, si ce graphique représente l'activité des utilisateurs :

       Day 
       12/1 12/2 12/3 12/4 ...
Hour 0  xx    x    x   xx
     1   x   xx        xx
     2 xxx    x    x   xx
     3   x              x
     4        x         x
     5   x              x
     6                  x
   ...

Vous voulez savoir que 02h00 est l'heure de la journée avec l'activité moyenne la plus élevée (une ligne avec 7 x ), et 12/4 était le jour le plus actif (une colonne avec 10 x ). Notez que cela ne signifie pas que 02:00 du 12/4 était l'heure la plus active de tous les temps, comme vous pouvez le voir dans l'exemple. Si ce n'est pas ce que vous voulez, veuillez clarifier avec des exemples concrets d'entrée et de résultat souhaité.

Nous faisons quelques hypothèses :

  • Un enregistrement d'activité peut commencer à une date et se terminer à la suivante. Par exemple :en ligne 2013-12-02 23:35 , hors ligne 2013-12-03 00:13 .
  • Aucun enregistrement d'activité n'a une durée supérieure à 23 heures, ou le nombre de tels enregistrements est négligeable.

Et nous devons définir ce que signifie « activité ». J'ai choisi les critères les plus faciles à calculer dans chaque cas. Les deux peuvent être rendus plus précis si nécessaire, au prix de requêtes plus complexes.

  • L'heure de la journée la plus active sera l'heure avec laquelle le plus d'enregistrements d'activité se chevauchent. Notez que si un utilisateur démarre et s'arrête plus d'une fois au cours de l'heure, il sera compté plus d'une fois.
  • Le jour le plus actif sera celui pour lequel il y a eu le plus d'utilisateurs uniques actifs à tout moment de la journée.

Pour l'heure la plus active de la journée, nous utiliserons une petite table auxiliaire contenant les 24 heures possibles. Il peut également être généré et joint à la volée avec les techniques décrites dans d'autres réponses.

CREATE TABLE hour ( hour tinyint not null, primary key(hour) );
INSERT hour (hour)
VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
     , (11), (12), (13), (14), (15), (16), (17), (18), (19), (20)
     , (21), (22), (23);

Ensuite, les requêtes suivantes donnent les résultats requis :

SELECT hour, count(*) AS activity
  FROM steamonlineactivity, hour
 WHERE ( hour BETWEEN hour(online) AND hour(offline)
      OR hour(online) BETWEEN hour(offline) AND hour
      OR hour(offline) BETWEEN hour AND hour(online) )
 GROUP BY hour
 ORDER BY activity DESC;

SELECT date, count(DISTINCT userID) AS activity
  FROM ( 
       SELECT userID, date(online) AS date
         FROM steamonlineactivity
        UNION
       SELECT userID, date(offline) AS date
         FROM steamonlineactivity
   ) AS x
 GROUP BY date
 ORDER BY activity DESC;