基于重叠范围的SQL组行

基于重叠范围的SQL组行,sql,postgresql,Sql,Postgresql,我有两个信号,在一天中的任意时间打开和关闭。 我怎样才能为所有这些图片选择它们通常是如何打开和关闭的,这样我就可以得到重叠的图片。在下面的图像中,我们有列信号_id1,2,对于每一列,我们都有带有start_datetime和end_datetime的行。我们需要图像中红色的结果 DB: 预期结果: 这就是所谓的缺口和孤岛问题。这是一种非常普遍的情况,因此我建议使用累积最大值来确定是否存在重叠: select min(start_date), max(end_date) from (select

我有两个信号,在一天中的任意时间打开和关闭。 我怎样才能为所有这些图片选择它们通常是如何打开和关闭的,这样我就可以得到重叠的图片。在下面的图像中,我们有列信号_id1,2,对于每一列,我们都有带有start_datetime和end_datetime的行。我们需要图像中红色的结果

DB:

预期结果:


这就是所谓的缺口和孤岛问题。这是一种非常普遍的情况,因此我建议使用累积最大值来确定是否存在重叠:

select min(start_date), max(end_date)
from (select t.*,
             sum(case when prev_end_date >= start_date then 0 else 1 end) over (order by start_date) as grp
      from (select t.*,
                   max(end_date) over (order by start_date rows between unbounded preceding and 1 preceding) as prev_end_date
            from t
           ) t
      ) t
group by grp;

这就是所谓的缺口和孤岛问题。这是一种非常普遍的情况,因此我建议使用累积最大值来确定是否存在重叠:

select min(start_date), max(end_date)
from (select t.*,
             sum(case when prev_end_date >= start_date then 0 else 1 end) over (order by start_date) as grp
      from (select t.*,
                   max(end_date) over (order by start_date rows between unbounded preceding and 1 preceding) as prev_end_date
            from t
           ) t
      ) t
group by grp;
您可以使用滞后和求和分析函数,如下所示:

select min(start_date), max(end_date)
from (select t.*,
             sum(case when prev_end_date >= start_date then 0 else 1 end) 
                over (order by start_date) as sm
      from (select t.*,
                   Lag(end_date) over (order by start_date) as prev_end_date
            from your_table t
           ) t
      ) t
group by sm;
礼貌:Gordon,正如使用他的查询创建新的一样。

您可以使用如下的滞后和求和分析函数:

select min(start_date), max(end_date)
from (select t.*,
             sum(case when prev_end_date >= start_date then 0 else 1 end) 
                over (order by start_date) as sm
      from (select t.*,
                   Lag(end_date) over (order by start_date) as prev_end_date
            from your_table t
           ) t
      ) t
group by sm;

礼貌:Gordon,使用他的查询创建了新的查询。

如果您想看到一个工作示例,请将数据设置为DBFIDLE。如果您想看到一个工作示例,请将数据设置为DBFIDLE。非常感谢,它似乎在工作,你如何解决相反的问题,而不是增加重叠来从第一个减去第二个?例如:@f14ka。一个新问题应该作为一个新问题来提出。非常感谢,它似乎在起作用。你如何解决相反的问题,而不是增加重叠以从第一个问题中减去第二个问题?例如:@f14ka。一个新问题应该作为一个新问题来提出。