我正在使用一个包含过去5年中多个办公室的入住和退房时间的数据集。要求我进行的项目之一是在假定正常营业时间(上午8点至下午5点)的情况下,计算每个房间在各个时间段(每天,每周,每月等)忙碌和空置的时间。两天的数据集样本如下所示:
room_id start_dt end_dt
Room: Room 3 2019-05-04 09:00:00 2019-05-04 11:30:00
Room: Room 3 2019-05-04 11:30:00 2019-05-04 12:15:00
Room: Room 3 2019-05-04 12:30:00 2019-05-04 13:00:00
Room: Room 3 2019-05-05 09:00:00 2019-05-05 13:00:00
Room: Room 4 2019-05-04 08:00:00 2019-05-04 09:00:00
Room: Room 4 2019-05-04 09:00:00 2019-05-04 11:00:00
Room: Room 4 2019-05-04 14:00:00 2019-05-04 16:00:00
Room: Room 4 2019-05-05 08:30:00 2019-05-05 09:30:00
[我借用并修改了@Branko Dimitrijevic在先前StackOverflow帖子中编写的一些代码(完整帖子:SQL Query to show gaps between multiple date ranges),以尝试处理多个不同的房间。下面是经过修改的代码,在SELECT子句中有两个room_id实例,用于调试:
SELECT t1.room_id, t2.room_id, end_dt, start_dt, start_dt - end_dt as gap_dur
FROM
(
SELECT DISTINCT room_id, start_dt, ROW_NUMBER() OVER (ORDER BY start_dt) RN
FROM my_table T1
WHERE
NOT EXISTS (
SELECT *
FROM my_table T2
WHERE (T1.start_dt > T2.start_dt and t1.resource = t2.resource)
AND (T1.start_dt < T2.end_dt and t1.resource = t2.resource)
)
) T1
JOIN (
SELECT DISTINCT resource, end_dt, ROW_NUMBER() OVER (ORDER BY end_dt) RN
FROM my_table T1
WHERE
NOT EXISTS (
SELECT *
FROM my_table T2
WHERE (T1.end_dt > T2.start_dt and t1.resource = t2.resource)
AND (T1.end_dt < T2.end_dt and t1.resource = t2.resource)
)
) T2
ON T1.RN - 1 = T2.RN
WHERE
end_dt < start_dt
这是我收到的输出:
room_id room_id end_dt start_dt gap_dur
Room: Exam 4 Room: Exam 4 2019-05-04 16:00:00 2019-05-05 08:30:00 16:30:00
Room: Exam 4 Room: Exam 3 2019-05-04 13:00:00 2019-05-04 14:00:00 01:00:00
Room: Exam 3 Room: Exam 3 2019-05-04 12:15:00 2019-05-04 12:30:00 00:15:00
但是,这在不同的房间之间变得越来越混乱,我不知道如何实施工作日约束,例如查找上午8点和第一个预定活动之间的时间间隔。下面是一个最佳输出,或者至少是一种数据格式,可以使用一些简单的GROUP BY脚本来计算我需要的统计信息:
room_id end_dt start_dt gap_dur
Room: Exam 3 2019-05-04 08:00:00 2019-05-04 09:00:00 01:00:00
Room: Exam 3 2019-05-04 12:15:00 2019-05-04 12:30:00 00:15:00
Room: Exam 3 2019-05-04 13:00:00 2019-05-04 17:00:00 04:00:00
Room: Exam 3 2019-05-05 08:00:00 2019-05-05 09:00:00 01:00:00
Room: Exam 3 2019-05-05 13:00:00 2019-05-05 17:00:00 04:00:00
Room: Exam 4 2019-05-04 11:00:00 2019-05-04 14:00:00 03:00:00
Room: Exam 4 2019-05-04 16:00:00 2019-05-04 17:00:00 01:00:00
Room: Exam 4 2019-05-05 08:00:00 2019-05-05 08:30:00 00:30:00
Room: Exam 4 2019-05-05 09:30:00 2019-05-05 17:00:00 09:30:00
在此方面的任何帮助将不胜感激,并乐意提供其他信息!
[我被要求从事的项目之一是在假设正常营业时间(上午8点至下午5点)的情况下,计算每个房间在不同时间段(每天,每周,每月等)的忙闲时间。
根据您的样本数据,两个假设似乎是合理的:
如果不正确,建议您提出一个新问题,并提供适当的说明和示例数据。
然后对于给定的一天,计算非常简单:
select date_trunc('day', start_dt),
sum( least(extract(epoch from end_dt), v.epoch2) -
greatest(extract(epoch from start_dt), epoch1)
) as busy_seconds,
(epoch2 - epoch1 -
sum( least(extract(epoch from end_dt), v.epoch2) -
greatest(extract(epoch from start_dt), epoch1)
)
) as free_seconds
from rooms r cross join
(values (extract(epoch from date_trunc('day', start_dt) + interval '8 hour'),
extract(epoch from date_trunc('day', start_dt) + interval '17 hour')
)
) v(epoch1, epoch2)
group by date_trunc('day', start_dt)