当前位置: 首页 > 知识库问答 >
问题:

有没有办法使用sql查询将一个时间序列数据表重叠到另一个时间序列数据表上?

薛祯
2023-03-14

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

我在Postgres DB中有两个表,我想重叠到另一个表上。

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

表B具有相同的列,但开头

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

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

下面是一个例子来说明:

表A-受影响者

表B-重叠器

表C重叠的结果

如您所见,如果表B中的行的开始时间在表a中的行时间范围内,则表a中的行的结束时间将替换为表B中的行的开始时间。相反,如果表B中的行的结束时间在表a中的时间范围内,然后,表A中行的开始时间替换为表B中行的结束时间。

其次,如果表A和表B中的开始时间和结束时间完全相同,则B中的行将替换A中的行。

第三,如果表B中一行的时间范围属于表A中一行的时间范围,那么表A行被分成2,第一行的结束时间是表B行的开始时间然后第二行的开始时间将是表B行的结束时间。

最后,必须为时间范围正确保留状态。

是否可以通过postgres sql查询实现这一点?。我没有发现任何类似的问题或答案。

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

共有1个答案

阚原
2023-03-14

一种方法是提取所有开始时间和结束时间,然后在该开始时间提取正确的状态,并使用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;
 类似资料:
  • 我在课堂上创建了两个列表。 其中一个称为预算,包含元素section、month和sum,返回以下内容: [Budzet{sec='AGD/RTV',月='01',和=96},Budzet{sec='AGD/RTV',月='03',和=30},Budzet{sec='食品',月='04',和=23},Budzet{sec='游戏',月='09',和=1084}...] 这是SQL查询 第二个是元素

  • 问题内容: 我确信这个问题以前可能已经被问过,但我似乎找不到正确的答案。如果我有两个清单 我正在尝试使用_list1重新排列_list2中的元素,以便它们完全匹配顺序。什么是最干净的方法?所需的输出: 很抱歉,如果这是重复的,但到目前为止,我只能使用压缩的sorted()方法找到数字列表的答案。 如果_list2是列表列表怎么办? 所需输出: 还有一个假设:如果我想使用_list1作为键对其他任何

  • 我有两个表:< code>person_concern和< code>person。它们都有一个< code >代码列,而< code>person有一个< code>dept列。我想从< code>person_concern表中选择数据,其中< code>person表中的< code>dept列= 30。 基本上,表的每一行都有不同的代码,然后将该人员放入一个部门。因此,我可以在表中使用相同

  • 问题内容: 我需要提取给定窗口的时间序列/数组的所有子序列。例如: 迭代序列的简单方法当然很昂贵,例如: 我发现了一种更好的方法,即复制序列,将其移动一个不同的值直到覆盖窗口,然后使用分割不同的序列。性能大约提高了100倍,因为for循环遍历窗口大小而不是序列大小: 我已经看到pandas在pandas.stats.moment模块中包含多个滚动功能,我想它们的作用在某种程度上类似于子序列问题。该

  • 我试图搜索一个列表包含另一个列表与MongoDB。 我将使用字符串列表进行搜索。假设列表L=[1,2,3,4,5] 例如,对于给定的列表L=[1,2,3,4,5],我希望返回带有_id1和2的文档。3不能返回,因为6不在L中。 我找到了两个解决方案 一 二 由于我想使用Spring Data MongoDb Criterias,我尝试编写上述解决方案,但代码似乎不起作用,它返回所有文档

  • 我有Table1中的数据,Table1是一个包含许多列的大型电子表格 并且我有一个很大的空表2,带有give列名: 某些列名与表1匹配。 如何使用表1中自动匹配重叠列名的数据填充表2?谢谢!