【问题标题】:Splitting multiple overlapping date range interval in postgresql在postgresql中拆分多个重叠的日期范围间隔
【发布时间】: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"

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"

【问题讨论】:

  • 请解释您所说的“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


【解决方案1】:

如果其他人需要解决这个问题,我想出了一些办法(也许不是最好的,但它有效)

解决办法是available here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-16
    • 2018-11-09
    • 1970-01-01
    • 2011-05-27
    • 2020-02-28
    • 2013-11-09
    • 2018-03-03
    • 2020-01-07
    相关资源
    最近更新 更多