Ако съм разбрал правилно вашите изисквания, ако тази графика представлява потребителска активност:
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
...
Искате да знаете, че 02:00 е времето от деня с най-висока средна активност (ред със 7 x
), а 12/4 беше най-активният ден (колона с 10 x
). Имайте предвид, че това не означава, че 02:00 на 12/4 е бил най-активният час досега, както можете да видите в примера. Ако това не е това, което искате, моля, изяснете го с конкретни примери за въвеждане и желания резултат.
Ние правим няколко предположения:
- Записът на дейност може да започне на една дата и да завърши на следващата. Например:онлайн
2013-12-02 23:35
, офлайн2013-12-03 00:13
. - Никой запис на дейност няма продължителност, по-голяма от 23 часа, или броят на тези записи е незначителен.
И трябва да дефинираме какво означава „активност“. Избрах критериите, които бяха по-лесни за изчисляване във всеки случай. И двете могат да бъдат направени по-точни, ако е необходимо, с цената на по-сложни заявки.
- Най-активното време от деня ще бъде часът, с който се припокриват повече записи за активност. Обърнете внимание, че ако даден потребител започне и спре повече от веднъж през часа, това ще бъде отчетено повече от веднъж.
- Най-активният ден ще бъде този, за който има повече уникални потребители, които са били активни по всяко време на деня.
За най-активното време на деня ще използваме малка помощна таблица, съдържаща 24-те възможни часа. Може също да се генерира и присъединява в движение с техниките, описани в други отговори.
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);
Тогава следните заявки дават необходимите резултати:
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;