Pokud jsem správně pochopil vaše požadavky, pokud tento graf představuje aktivitu uživatele:
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
...
Chcete vědět, že 02:00 je čas dne s nejvyšší průměrnou aktivitou (řádek se 7 x
) a 12/4 byl nejaktivnější den (sloupec s 10 x
). Všimněte si, že to neznamená, že 02:00 ze 12/4 byla vůbec nejaktivnější hodinou, jak můžete vidět na příkladu. Pokud to není to, co chcete, ujasněte si prosím konkrétní příklady vstupu a požadovaného výsledku.
Vycházíme z několika předpokladů:
- Záznam aktivity může začít v jeden den a skončit v další. Například:online
2013-12-02 23:35
, offline2013-12-03 00:13
. - Žádný záznam o činnosti netrvá déle než 23 hodin nebo je počet takových záznamů zanedbatelný.
A musíme definovat, co znamená „aktivita“. Vybral jsem kritéria, která se v každém případě snáze vypočítala. Obojí lze v případě potřeby zpřesnit za cenu složitějších dotazů.
- Nejaktivnější denní dobou bude hodina, se kterou se překrývá více záznamů aktivit. Pamatujte, že pokud uživatel během hodiny spustí a zastaví více než jednou, bude to započítáno více než jednou.
- Nejaktivnějším dnem bude den, kdy bylo v kteroukoli denní dobu aktivních více jedinečných uživatelů.
Pro nejaktivnější denní dobu použijeme malý pomocný stůl s 24 možnými hodinami. Lze jej také generovat a spojovat za běhu pomocí technik popsaných v jiných odpovědích.
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);
Potom následující dotazy poskytnou požadované výsledky:
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;