我有一张表,如下所示:
CREATE TABLE time_records (
id uuid NOT NULL,
employee_id uuid NOT NULL,
starttime timestampt NOT NULL,
endtime timestampt NOT NULL
)
同一Employee_id的记录之间会有时间重叠:
id | employee_id | starttime | endtime |
---|---|---|---|
1 | 1 | '2023-09-01 07:00:00' | '2023-09-01 09:15:00' |
2 | 1 | '2023-09-01 07:00:00' | '2023-09-01 15:00:00' |
3 | 1 | '2023-09-01 07:00:00' | '2023-09-01 15:00:00' |
4 | 1 | '2023-09-01 14:00:00' | '2023-09-01 15:00:00' |
5 | 1 | '2023-09-01 23:45:00' | '2023-09-01 23:59:00' |
6 | 1 | '2023-09-01 23:45:00' | '2023-09-01 23:59:00' |
我要做的是获取所有这些时间的时间范围:
employee_id | starttime | endtime | ids |
---|---|---|---|
1 | '2023-09-01 07:00:00' | '2023-09-01 15:00:00' | [1,2,3,4] |
1 | '2023-09-01 23:45:00' | '2023-09-01 23:29:00' | [5,6] |
如果一天内只有一组重叠时间,我可以使用max/min作为开始时间和结束时间,但当一天有多组重叠时间时,我似乎无法使其工作:
select timea.employee_id,
min(timea.starttime) starttime,
max(timea.endtime) endtime,
array_agg(timea.id) ids
from time_records timea
inner join time_records timea2 on timea.employee_id = timea2.employee_id and
tsrange(timea2.starttime, timea2.endtime, '[]') &&
tsrange(timea.starttime, timea.endtime, '[]')
and timea.id != timea2.id
group by timea.employee_id;
结果:
employee_id | starttime | endtime | ids |
---|---|---|---|
1 | '2023-09-01 07:00:00' | '2023-09-01 23:59:00' | [1,2,3,4,5,6] |