如果我正确理解您的要求,如果该图代表用户活动:
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 是最活跃的一天(一列有 10x
)。请注意,这并不意味着 12/4 的 02:00 是有史以来最活跃的时间,正如您在示例中看到的那样。如果这不是您想要的,请用输入和期望结果的具体示例进行澄清。
我们做出几个假设:
- 活动记录可以在一个日期开始并在下一个日期结束。例如:在线
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;