طريقة أنيقة لرسم مخطط شريطي لكل ساعة من بيانات الفاصل الزمني؟
سؤال
لدي قائمة بإدخالات الجدول الزمني التي تعرض وقت البدء والتوقف.هذا موجود في قاعدة بيانات MySQL.أحتاج إلى إنشاء مخططات شريطية بناءً على هذه البيانات مع 24 ساعة من اليوم على طول الجزء السفلي ومقدار ساعات العمل لكل ساعة من اليوم.
على سبيل المثال، إذا عملت أليس في وظيفة من الساعة 15:30 إلى الساعة 19:30 وعمل بوب من الساعة 12:15 إلى الساعة 17:00، فسيبدو المخطط كما يلي:
لدي الآن حل WTFey يتضمن جدول بيانات يخرج إلى العمود DY أو شيء من هذا القبيل.الدقة المطلوبة هي فترات زمنية مدتها 15 دقيقة.
أفترض أن هذا هو أفضل شيء يتم القيام به في قاعدة البيانات ثم تصديره لإنشاء المخطط.اسمحوا لي أن أعرف إذا فاتني أي تفاصيل.شكرًا.
المحلول
قم بإنشاء جدول يحتوي على الوقت فقط من منتصف الليل إلى منتصف الليل ويحتوي على كل دقيقة من اليوم.في عالم مستودع البيانات، نسمي هذا البعد الزمني.هنا مثال:
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
بعد ذلك، كل ما عليك فعله هو ضم جدولك إلى البعد الزمني ثم تجميعه حسب الفاصل الزمني_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.
احصل الآن على جدول العمل الخاص بك، والذي أسميته "النشاط" هنا، والذي يحتوي على عمودين start_time وend_time.
لقد أضفت قيمًا لأليس وبوب وفقًا للسؤال الأصلي.
إليك الاستعلام من 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
ينظر للحق...