在 oracle SQL 中基于重叠日期范围连接客户端记录

Posted

技术标签:

【中文标题】在 oracle SQL 中基于重叠日期范围连接客户端记录【英文标题】:Joining client records based on overlapping date ranges in oracle SQL 【发布时间】:2021-02-10 11:48:18 【问题描述】:

我有一个如下所示的数据集:

Client id stayId start_date end_date type
1 101 1-1-2010 20-7-2010 A
1 105 1-7-2010 30-12-2010 A
2 108. 8-10-2012 10-12-2012 B
2 108. 8-10-2012 10-12-2012 B

我想合并具有重叠日期范围的行并采用最高的 stayId,但前提是客户端 ID 和类型匹配。我应该如何在 oracle sql 中执行此操作?

结果如下所示:

Client id stayId start_date end_date type
1 105 1-1-2010 30-12-2010 A
2 108. 8-10-2012 10-12-2012 B
2 108. 01-01-2013 13-10-2013 B

【问题讨论】:

【参考方案1】:

这是一种孤岛问题。它看起来很棘手,因为可能存在任意重叠——我怀疑重叠甚至可能是更早的记录,如:

      |------|   |-------|
|------------------|

对于这个版本,我建议使用累积最大值来识别没有重叠的行。这些行开始“岛屿”。然后,累积总和识别岛屿(没有重叠的行的总和)。最后一步是聚合:

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

【讨论】:

以上是关于在 oracle SQL 中基于重叠日期范围连接客户端记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中选择重叠的日期范围

SQL 重叠日期范围

SQL Server 2014 合并重叠日期范围

PL/SQL:在由开始和结束定义的重叠日期范围内查找孤岛

Oracle SQL 选择具有开始和结束日期的行,如果某些重叠合并行

SQL中的重叠日期