优雅的方法绘制每小时的条形图,从时间间隔数据?
解决方案
创建一个表,只有时间在这上从午夜到午夜包含的每一分钟。在数据仓库的世界,我们会叫这个时间维度。这里有一个例子:
TIME_DIM
-id
-time_of_day
-interval_15
-interval_30
一个例子数据表将
id time_of_day interval_15 interval_30
1 00:00 00:00 00:00
...
30 00:23 00:15 00:00
...
100 05:44 05:30 05:30
然后你所要做的就是加入你们的表的时间尺度以及随后组通过interval_15.例如:
SELECT b.interval_15, count(*)
FROM my_data_table a
INNER JOIN time_dim b ON a.time_field = b.time
WHERE a.date_field = now()
GROUP BY b.interval_15
其他提示
我想出了一个伪代码解决方案,希望这有所帮助。
create an array named timetable with 24 entries
initialise timetable to zero
for each user in SQLtable
firsthour = user.firsthour
lasthour = user.lasthour
firstminutes = 4 - (rounded down integer(user.firstminutes/15))
lastminutes = rounded down integer(user.lastminutes/15)
timetable(firsthour) = timetable(firsthour) + firstminutes
timetable(lasthour) = timetable(lasthour) + lastminutes
for index=firsthour+1 to lasthour-1
timetable(index) = timetable(index) + 4
next index
next user
现在的时间表阵列拥有的价值,你的愿望,在15分钟粒度,即。一个值的4=1小时,5=1小时15分钟,14=3小时30分钟。
这里是另一个伪代码解决方案,从不同的角度;一位更加密集,因为它并96查询每24小时期间:
results = []
for time in range(0, 24, .25):
amount = mysql("select count(*) from User_Activity_Table where time >= start_time and time <= end_time")
results.append(amount)
这个怎么样:
使用"时代"表,但有两栏,含有15分钟的时间间隔。该from_times是15分钟时间,to_times是前一秒钟,下一from_times.例如12:30:00至12:44:59.
现在让你的人工作表,我已经被称为"活动"这里,字和结束时间列。
我加值爱丽丝和鲍勃按原来的问题。
这里的查询,从MySQL:
SELECT HOUR(times.from_time) AS 'TIME', count(*) / 4 AS 'HOURS'
FROM times
JOIN activity
ON times.from_time >= activity.start_time AND
times.to_time <= activity.end_time
GROUP BY HOUR(times.from_time)
ORDER BY HOUR(times.from_time)
它给我这样的:
TIME HOURS
12 0.7500
13 1.0000
14 1.0000
15 1.5000
16 2.0000
17 1.0000
18 1.0000
19 0.7500
看起来有关的权利...
不隶属于 StackOverflow