시간 간격 데이터에서 시간별 막대 차트를 그리는 우아한 방법은 무엇입니까?

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

  •  09-06-2019
  •  | 
  •  

문제

시작 시간과 종료 시간을 표시하는 작업표 항목 목록이 있습니다.이것은 MySQL 데이터베이스에 있습니다.이 데이터를 기반으로 하단에 하루 24시간이 표시되고 각 시간에 대해 작업한 노동 시간이 표시되는 막대형 차트를 만들어야 합니다.

예를 들어, Alice가 15:30부터 19:30까지 일하고 Bob이 12:15부터 17:00까지 일한 경우 차트는 다음과 같습니다.

Example Chart

나는 지금 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

대략 맞는 것 같은데...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top