SQL 查找两个日期范围之间的重复活动记录
SQL find duplicate active records between two date ranges
我有两个 table,一个患者 table 和一个保险 Table。一名患者可以拥有多项保险。我正在尝试查找具有重叠有效日期或显示两个有效的所有保险。
PATID START_DTTM END_DTTM
1 2002-09-10 00:00:00.000 NULL
1 2007-03-06 10:18:00.000 2019-04-11 11:59:00.000
如果 END_DTTM 为 Null,则它处于活动状态。开始日期应在后续结束日期结束时开始。我正在尝试查找活动日期重叠的所有条目,或者如果有意义的话,它会显示一段时间内的两个活动条目?
另外,一个病人可以有多个保险,上面的例子显示了一个病人有两个保险细节。他们也可以有第三个或第四个条目...
任何帮助都会很棒
如果您的保险 table 也有每个保险的唯一 ID(我们希望如此),那么您可以进行这样的查询
declare @tab table (
patid int
, insid int
, start_dttm datetime
, end_dttm datetime
)
insert into @tab values (1, 8, '2002-09-10', NULL)
, (1, 9, '2007-03-06', '2019-04-11')
, (53, 321513, '2015-01-13', NULL )
, (53, 11, '2008-08-14', '2015-01-13')
, (54, 12, '2015-01-13', NULL )
, (54, 13, '2008-08-14', '2015-01-12')
select a.*
, b.*
, 'Insurance record ' + cast(b.insid as varchar) + ' (' + convert(varchar,b.start_dttm,103) + ' to ' + convert(varchar,b.end_dttm,103) + ') '
+ 'overlaps Insurance record ' + cast(a.insid as varchar) + ' (' + convert(varchar,a.start_dttm,103) + isnull(' to ' + convert(varchar,a.end_dttm,103), ' still active') + ')'
from @tab a
inner join @tab b
on a.patid = b.patid
and a.insid != b.insid
where (b.start_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or (b.end_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or (a.end_dttm is null and b.end_dttm is null)
注意 - 您不需要像我一样创建一个 table 变量 @tab,只需使用您的保险 table.
这将列出至少有一项其他保险重叠的所有保险。
select ID, PATID, START_DTTM, END_DTTM
from insurances i1
where exists (select null
from insurances i2
where i1.ID != i2.ID and i1.PATID = i2.PATID
and (i1.START_DTTM <= i2.END_DTTM or i2.END_DTTM is null)
and (i2.START_DTTM <= i1.END_DTTM or i1.END_DTTM is null)
)
order by PATID, START_DTTM;
两项有效保险(无效结束日期)被视为重叠。如果相同的开始/结束日期不被视为重叠,您可能希望将 <=
更改为 <
。
我有两个 table,一个患者 table 和一个保险 Table。一名患者可以拥有多项保险。我正在尝试查找具有重叠有效日期或显示两个有效的所有保险。
PATID START_DTTM END_DTTM
1 2002-09-10 00:00:00.000 NULL
1 2007-03-06 10:18:00.000 2019-04-11 11:59:00.000
如果 END_DTTM 为 Null,则它处于活动状态。开始日期应在后续结束日期结束时开始。我正在尝试查找活动日期重叠的所有条目,或者如果有意义的话,它会显示一段时间内的两个活动条目?
另外,一个病人可以有多个保险,上面的例子显示了一个病人有两个保险细节。他们也可以有第三个或第四个条目...
任何帮助都会很棒
如果您的保险 table 也有每个保险的唯一 ID(我们希望如此),那么您可以进行这样的查询
declare @tab table (
patid int
, insid int
, start_dttm datetime
, end_dttm datetime
)
insert into @tab values (1, 8, '2002-09-10', NULL)
, (1, 9, '2007-03-06', '2019-04-11')
, (53, 321513, '2015-01-13', NULL )
, (53, 11, '2008-08-14', '2015-01-13')
, (54, 12, '2015-01-13', NULL )
, (54, 13, '2008-08-14', '2015-01-12')
select a.*
, b.*
, 'Insurance record ' + cast(b.insid as varchar) + ' (' + convert(varchar,b.start_dttm,103) + ' to ' + convert(varchar,b.end_dttm,103) + ') '
+ 'overlaps Insurance record ' + cast(a.insid as varchar) + ' (' + convert(varchar,a.start_dttm,103) + isnull(' to ' + convert(varchar,a.end_dttm,103), ' still active') + ')'
from @tab a
inner join @tab b
on a.patid = b.patid
and a.insid != b.insid
where (b.start_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or (b.end_dttm > a.start_dttm and b.start_dttm < isnull(a.end_dttm, getdate()+1))
or (a.end_dttm is null and b.end_dttm is null)
注意 - 您不需要像我一样创建一个 table 变量 @tab,只需使用您的保险 table.
这将列出至少有一项其他保险重叠的所有保险。
select ID, PATID, START_DTTM, END_DTTM
from insurances i1
where exists (select null
from insurances i2
where i1.ID != i2.ID and i1.PATID = i2.PATID
and (i1.START_DTTM <= i2.END_DTTM or i2.END_DTTM is null)
and (i2.START_DTTM <= i1.END_DTTM or i1.END_DTTM is null)
)
order by PATID, START_DTTM;
两项有效保险(无效结束日期)被视为重叠。如果相同的开始/结束日期不被视为重叠,您可能希望将 <=
更改为 <
。