我需要查找表格的重叠日期。因此,基本结构是ID,PFX,开始日期和结束日期。因此,给定ID的PFX与每个ID的另一个PFX重叠。
我尝试了这个,没有运气。 https://www.sqlservercentral.com/forums/topic/how-to-extract-overlapping-date-ranges-from-a-table-of-date-ranges
突出显示的是我想显示为重叠的部分。
Drop table #zzz_Overlapping
CREATE TABLE #zzz_Overlapping(
[ID] [varchar](500) NULL,
[PFX] [varchar](500) NULL,
[EFF_DT] [datetime] NULL,
[TERM_DT] [datetime] NULL
) ON [PRIMARY]
GO
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 123,'ABDM','1997-06-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 123,'ABDM','1997-10-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 123,'CSM1','1997-11-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 123,'CSM1','1998-01-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 123,'ABDD','1999-01-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 417,'CSM1','2001-06-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 417,'CSM1','2001-10-01','9999-12-31')
insert into #zzz_Overlapping (ID,PFX,EFF_DT,TERM_DT)
values ( 417,'CSM2','2001-11-01','9999-12-31')
select * from #zzz_Overlapping
select CONCAT(ID, PFX) FROM #zzz_Overlapping
SELECT A.*
FROM #zzz_Overlapping A
JOIN #zzz_Overlapping B
ON B.ID = A.ID
AND ((A.EFF_DT BETWEEN B.EFF_DT AND B.TERM_DT)
OR (A.TERM_DT BETWEEN B.EFF_DT AND B.TERM_DT))
WHERE B.EFF_DT != A.EFF_DT OR B.TERM_DT != A.TERM_DT;
SELECT A.ID, A.PFX, A.EFF_DT, A.TERM_DT, B.PFX, B.EFF_DT, B.TERM_DT
FROM #zzz_Overlapping A
INNER JOIN #zzz_Overlapping B
ON B.ID = A.ID
AND B.EFF_DT < A.TERM_DT
AND A.EFF_DT < B.TERM_DT
AND A.EFF_DT < B.EFF_DT;
答案 0 :(得分:1)
您似乎想要:
select o.*
from #zzz_Overlapping o
where exists (select 1
from #zzz_Overlapping o2
where o2.id = o.id and
o2.prefix = o.prefix and
o2.eff_dte < o.end_dte and
o2.end_dte > o.eff_dte
);
答案 1 :(得分:1)
根据戈登的回答,您可以检查以下内容吗?
with data
as (select row_number() over(order by (select null)) as rnk
,*
from #zzz_overlapping
)
select o.*
from data o
where exists (select 1
from data o2
where o2.id = o.id and
o2.PFX = o.PFX and
o2.EFF_DT <= o.TERM_DT and
o2.TERM_DT >= o.EFF_DT and
o2.rnk <> o.rnk
)
dbfiddle链接。 https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=11f4e9dc6bd96df6f0c8145df0b953a8