在postgresql

时间:2019-07-06 18:40:04

标签: sql postgresql

我正在使用postgresql版本10.9,并且尝试从记录事件的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"

Rextester Fiddle

基本上,我希望得到如下所示的间隔结果:

    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"

1 个答案:

答案 0 :(得分:0)

万一其他人需要解决方案,我想出了一些办法(也许不是最好的办法,但它能奏效)

解决方案是available here