在 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 中基于重叠日期范围连接客户端记录的主要内容,如果未能解决你的问题,请参考以下文章