طريقة أنيقة لرسم مخطط شريطي لكل ساعة من بيانات الفاصل الزمني؟

StackOverflow https://stackoverflow.com/questions/79789

  •  09-06-2019
  •  | 
  •  

سؤال

لدي قائمة بإدخالات الجدول الزمني التي تعرض وقت البدء والتوقف.هذا موجود في قاعدة بيانات MySQL.أحتاج إلى إنشاء مخططات شريطية بناءً على هذه البيانات مع 24 ساعة من اليوم على طول الجزء السفلي ومقدار ساعات العمل لكل ساعة من اليوم.

على سبيل المثال، إذا عملت أليس في وظيفة من الساعة 15:30 إلى الساعة 19:30 وعمل بوب من الساعة 12:15 إلى الساعة 17:00، فسيبدو المخطط كما يلي:

Example Chart

لدي الآن حل 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

ينظر للحق...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top