【发布时间】:2019-07-12 22:31:49
【问题描述】:
我正在使用 10.9 版的 postgresql,我试图从记录事件的 2 个不同表中拆分重叠间隔。
对于主表的每个区间,我需要检测与主区间重叠的人员移动(到达或离开),并按事件将其拆分为每个 prod_line。如果人的运动是到达,我需要以5分钟间隔连续到达的最高值。如果人员移动是出发,我需要连续出发的间隔5分钟取最小值。
我只找到了在同一个表中合并日期范围的重叠间隔的示例。 我试图编写一个循环遍历主数据集的函数,并为每个间隔循环遍历出勤间隔并返回重叠间隔。 我未能使出勤间隔考虑到 5 分钟间隔内的最高到达时间和 5 分钟间隔内的最低出发时间值,并进一步将其与主要当前间隔进行比较以按预期正确拆分。
我的 2 个表具有以下结构
main (prod_line text, item_code text, start_time timestamp without time zone, end_time timestamp without time zone);
attendance(person_id text, prod_line text, arrival_time timestamp without time zone, departure_time timestamp without time zone);
Main:
有以下示例数据 "RS-5";"110067805";"2019-06-11 06:30:41";"2019-06-11 15:00:05"
对于出勤率
11770;"RS-5";"2019-06-11 06:30:09";"2019-06-11 11:00:12"
675;"RS-5";"2019-06-11 06:30:14";"2019-06-11 10:00:01"
11504;"RS-5";"2019-06-11 06:30:17";"2019-06-11 10:00:07"
101;"RS-5";"2019-06-11 06:30:23";"2019-06-11 11:00:10"
627;"RS-5";"2019-06-11 06:30:25";"2019-06-11 11:00:20"
11765;"RS-5";"2019-06-11 06:34:29";"2019-06-11 11:00:01"
675;"RS-5";"2019-06-11 11:30:09";"2019-06-11 15:00:25"
627;"RS-5";"2019-06-11 11:30:16";"2019-06-11 15:00:24"
11504;"RS-5";"2019-06-11 11:30:19";"2019-06-11 15:00:18"
11770;"RS-5";"2019-06-11 11:30:22";"2019-06-11 15:00:15"
11765;"RS-5";"2019-06-11 11:30:25";"2019-06-11 15:00:12"
101;"RS-5";"2019-06-11 11:30:27";"2019-06-11 15:00:30"
353;"RS-5";"2019-06-11 15:01:39";"2019-06-11 15:10:35"
11712;"RS-5";"2019-06-11 15:01:42";"2019-06-11 15:10:34"
817;"RS-5";"2019-06-11 15:01:44";"2019-06-11 15:10:32"
1337;"RS-5";"2019-06-11 15:01:46";"2019-06-11 15:10:30"
1363;"RS-5";"2019-06-11 15:01:48";"2019-06-11 15:10:28"
1510;"RS-5";"2019-06-11 15:01:50";"2019-06-11 15:10:24"
基本上,我希望得到如下间隔的结果:
result (prod_line text, item_code text, start_time timestamp without time zone, end_time timestamp without time zone);
价值观
"RS-5";"110067805";"2019-06-11 06:34:29";"2019-06-11 10:00:01"
"RS-5";"110067805";"2019-06-11 10:00:07";"2019-06-11 11:00:01"
"RS-5";"110067805";"2019-06-11 11:00:01";"2019-06-11 11:30:27"
"RS-5";"110067805";"2019-06-11 11:30:27";"2019-06-11 15:00:05"
【问题讨论】:
-
请解释您所说的“5分钟间隔连续到达(出发)的最高(最低)值”是什么意思。还有一个示例,说明如何导出导致指示的几个所需输出。
-
您好,感谢您帮助我。让我试着解释得更清楚些。例如在 Main 中,对于 RS-5 行,我将 start_date 设置为 06:30:41。我需要在这个时间前后每隔 5 分钟检查出勤表中发生了什么,并得到两个表之间的最大值,在这种情况下,我需要它是 06:34:29。
-
对于同一行,end_time 是 15:00:05。我需要检查 6:34:29 到 15:00:05 之间发生了什么。在这种情况下,有人在 10:00:01 离开。所以这需要生成一个从 6:34:29 到 10:00:01 的时间间隔。然后我需要检查 10:00:01 到 15:00:05 之间的下一个事件(到达或离开)。 11:00 左右有多个班次,我需要其中最低的班次:11:00:01。所以对于这条线,对于 6 月 11 日,我希望得到 3 个间隔 06:34:29 -> 10:00:01, 10:00:01 -> 11:00:01, 11:30:27 -> 15 :00:05。
标签: sql postgresql