Om jag förstått dina krav rätt, om denna graf representerar användaraktivitet:
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
...
Du vill veta att 02:00 är den tid på dygnet med högst genomsnittlig aktivitet (en rad med 7 x
), och 12/4 var den mest aktiva dagen (en kolumn med 10 x
). Observera att detta inte betyder att 02:00 den 12/4 var den mest aktiva timmen någonsin, som du kan se i exemplet. Om detta inte är vad du vill, förtydliga gärna med konkreta exempel på input och önskat resultat.
Vi gör ett par antaganden:
- En aktivitetspost kan börja på ett datum och sluta på nästa. Till exempel:online
2013-12-02 23:35
, offline2013-12-03 00:13
. - Ingen aktivitetspost har en längre varaktighet än 23 timmar, eller så är antalet sådana poster försumbart.
Och vi måste definiera vad "aktivitet" betyder. Jag valde de kriterier som var lättare att beräkna i varje fall. Båda kan göras mer exakta om det behövs, till priset av mer komplexa frågor.
- Den mest aktiva tiden på dygnet är den timme med vilken fler aktivitetsposter överlappar. Observera att om en användare startar och stannar mer än en gång under timmen kommer den att räknas mer än en gång.
- Den mest aktiva dagen kommer att vara den för vilken det fanns fler unika användare som var aktiva när som helst på dagen.
För den mest aktiva tiden på dygnet kommer vi att använda ett litet extrabord som håller de 24 möjliga timmarna. Den kan också genereras och sammanfogas i farten med de tekniker som beskrivs i andra svar.
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);
Sedan ger följande frågor de önskade resultaten:
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;