시간 간격 데이터에서 시간별 막대 차트를 그리는 우아한 방법은 무엇입니까?
문제
시작 시간과 종료 시간을 표시하는 작업표 항목 목록이 있습니다.이것은 MySQL 데이터베이스에 있습니다.이 데이터를 기반으로 하단에 하루 24시간이 표시되고 각 시간에 대해 작업한 노동 시간이 표시되는 막대형 차트를 만들어야 합니다.
예를 들어, Alice가 15:30부터 19:30까지 일하고 Bob이 12:15부터 17:00까지 일한 경우 차트는 다음과 같습니다.
나는 지금 DY 열이나 그와 유사한 스프레드시트를 포함하는 WTFey 솔루션을 가지고 있습니다.필요한 해결 방법은 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분.
다음은 다른 각도에서 본 또 다른 의사코드 솔루션입니다.24시간마다 96개의 쿼리를 수행하므로 좀 더 집약적입니다.
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보다 1초 전입니다.예를 들어 12:30:00부터 12:44:59까지입니다.
이제 여기서는 start_time 및 end_time 열이 있는 "활동"이라고 부르는 개인 작업 테이블을 가져옵니다.
원래 질문에 따라 Alice와 Bob에 대한 값을 추가했습니다.
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
대략 맞는 것 같은데...