【发布时间】:2021-04-01 19:22:39
【问题描述】:
我有一个要求,我必须将给定表上的重叠记录拆分为 2 个日期字段。
认为这是我的输入表 TableT。
| ID | EFFECTIVE_DATE | END_DATE |
|---|---|---|
| JKL | 2016-01-01 | 2016-12-31 |
| JKL | 2016-04-01 | 2016-12-31 |
| JKL | 2016-01-01 | 2016-03-04 |
| JKL | 2016-04-01 | 2016-12-31 |
| JKL | 2016-01-01 | 2016-12-31 |
我希望我的输出如下所示。我需要在 SQL Server 和 Oracle\DB2 中实现这一点,所以我正在寻找一个通用的解决方案。
| ID | EFFECTIVE_DATE | END_DATE |
|---|---|---|
| JKL | 2016-01-01 | 2016-03-04 |
| JKL | 2016-03-05 | 2016-03-31 |
| JKL | 2016-04-01 | 2016-12-31 |
这是我尝试过的
With EndDates as (
select END_DATE as END_DATE,TRIM(ID) as ID FROM TableT
union all
select ADD_DAYS(EFFECTIVE_DATE, -1) as END_DATE,TRIM(ID) as ID FROM TableT
), Periods as (
select ID as ID,MIN(EFFECTIVE_DATE) as EFFECTIVE_DATE,
(select MIN(END_DATE) from EndDates e
where e.ID = t.ID and
e.END_DATE >= MIN(EFFECTIVE_DATE)) as END_DATE
from
TableT t
group by ID),
EXTN_PERIOD as (select p.ID as ID, ADD_DAYS(p.END_DATE, 1) as EFFECTIVE_DATE,e.END_DATE as END_DATE
from
Periods p
inner join
EndDates e
on
p.ID = e.ID and
p.END_DATE < e.END_DATE
where
not exists (select * from EndDates e2 where
e2.ID = p.ID and
e2.END_DATE > p.END_DATE and
e2.END_DATE < e.END_DATE)
)
select * from EXTN_PERIOD
union
select * from PERIODS
它部分工作正常,但没有给我想要的输出。
这是我运行上述查询时得到的输出:
| ID | EFFECTIVE_DATE | END_DATE |
|---|---|---|
| JKL | 2016-01-01 | 2016-03-04 |
| JKL | 2016-03-05 | 2016-03-31 |
提前致谢!
【问题讨论】:
-
这需要在 2 个 rdbms sqlserver 和 oracle(或)db2 中实现解决方案。我只标记了必需的 rdbms
-
在您提供的示例中,您只有 1 个重叠的日期范围,即
2016-01-01到2016-12-31。您会有多个重叠的日期范围吗?
标签: sql sql-server oracle db2