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