【问题标题】:Is there a way to overlap a time series data table onto another using an sql query?有没有办法使用 sql 查询将时间序列数据表重叠到另一个上?
【发布时间】:2021-06-10 01:13:01
【问题描述】:

希望我能在这里找到我的难题的答案。

我在 Postgres 数据库中有两个表,我想在另一个上重叠。

表 A 有 3 列:“开始时间”、“结束时间”和“状态”。在每一行中,开始时间等于前一行的结束时间。

表 B 具有相同的列,但开始和结束时间不相邻且不重叠。

我想将表 B 重叠到表 A 上以创建表 C。

表 C 的每一行的开始时间也等于前一行的结束时间。

这是一个澄清的例子:

表 A - 重叠

State Start Time End Time
1 12:00:00 AM 12:10:00 AM
2 12:10:00 AM 12:20:00 AM
1 12:20:00 AM 12:30:00 AM
2 12:30:00 AM 12:40:00 AM
1 12:40:00 AM 12:50:00 AM
2 12:50:00 AM 1:00:00 AM

表 B - 重叠

State Start Time End Time
5 12:05:00 AM 12:25:00 AM
6 12:31:00 AM 12:35:00 AM
5 12:40:00 AM 12:50:00 AM

表 C - 重叠的结果

State Start Time End Time
1 12:00:00 AM 12:05:00 AM
5 12:05:00 AM 12:25:00 AM
1 12:25:00 AM 12:30:00 AM
2 12:30:00 AM 12:31:00 AM
6 12:31:00 AM 12:35:00 AM
2 12:35:00 AM 12:40:00 AM
5 12:40:00 AM 12:50:00 AM
2 12:50:00 AM 1:00:00 AM

如您所见,如果表 B 中某行的开始时间在表 A 中的某行时间范围内,则将表 A 中该行的结束时间替换为表 B 中该行的开始时间. 反之,如果B表中某行的结束时间在A表的某个时间范围内,则将A表中该行的开始时间替换为B表中该行的结束时间。

其次,如果表A和B中的开始时间和结束时间完全相同,那么B中的行就简单地替换A中的行。

第三,如果B表中某行的时间范围在A表中某行的时间范围内,则将A表行拆分为2行,第一行的结束时间为开始时间表 B 行,然后第二行的开始时间将是表 B 行的结束时间。

最后,必须在时间范围内正确保存状态。

是否可以使用 postgres sql 查询来完成此操作?我没有找到任何类似的问题或答案。

注意:为了简单起见,我在此处省略了每个表中的 ID 列,但如果它有助于实现重叠,则可以使用。

【问题讨论】:

    标签: sql database postgresql time-series


    【解决方案1】:

    一种方法是提取所有的开始时间和结束时间,然后拉取该开始时间的正确状态,并使用lead()获取结束时间:

    with t as (
          select starttime as tm
          from a
          union  -- on purpose to remove duplicates
          select endtime
          from a
          union 
          select starttime as tm
          from b
          union  -- on purpose to remove duplicates
          select endtime
          from b
         )
    select t.tm, lead(t.tm) over (order by t.tm) as endtime,
           (select ab.state
            from ((select a.*
                   from a
                  ) union all
                  (select b.*
                   from b
                  )
                 ) ab
            where ab.starttime <= t.tm and t.tm < ab.endtime
            order by ab.starttime desc
            limit 1
           ) as state
    from t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      相关资源
      最近更新 更多