需要 select 个具有相同产品分组日期范围重叠的记录
Need to select records that have overlapping date ranges for same product groupings
create table #productcov
(
[group] varchar(20), -- as business
account varchar(10), -- as business location
member varchar(10), -- as member
product varchar(10), -- as health product
[plan] varchar(10), -- as product type
StartTime datetime, -- as beginning of coverage period
EndTime datetime -- as end of coverage period
)
go
insert into #productcov values
('NN00001','10001','1234567890','ADD','A1000','2010-10-01 00:00:00' , '2012-09-30 00:00:00'),
('NN00001','10001','1234567890','ADD','A1000','2012-10-01 00:00:00' , '2013-09-30 00:00:00'),
('NN00001','10001','1234567890','ADD','A1000','2013-01-01 00:00:00' , '2013-12-31 00:00:00'),
('NN00001','10001','1234567890','ADD','B1000','2010-01-01 00:00:00' , '2014-12-31 00:00:00'),
('NN00001','10001','1234567890','ADD','B1000','2015-01-01 00:00:00' , '2016-12-31 00:00:00'),
('NN00001','10001','1234567890','LIF','A1000','2010-10-01 00:00:00' , '2012-09-30 00:00:00'),
('NN00001','10001','1234567890','LIF','A1000','2012-10-01 00:00:00' , '2013-09-30 00:00:00'),
('NN00001','10001','1234567890','LIF','A1000','2013-01-01 00:00:00' , '2013-12-31 00:00:00'),
('NN00001','10001','1234567890','LIF','B1000','2010-01-01 00:00:00' , '2014-12-31 00:00:00'),
('NN00001','10001','1234567890','LIF','B1000','2015-01-01 00:00:00' , '2016-12-31 00:00:00')
select * from #productcov
上面的示例 table 适用于单个组中的单个成员。我正在尝试 select #productcov table 中十条记录中的第二条、第三条、第七条和第八条记录,其中医疗产品的承保日期与会员产品重叠。这是一个审计过程,用于清理覆盖日期中的重叠数据。 table 中重要的重叠日期需要按组、帐户、成员、产品和计划分组。
几天来我一直在努力寻找解决方案,但一无所获!感谢任何帮助。
所需的输出将是下面列出的 4 条记录:
组、帐户、成员、产品、计划、开始日期、结束日期
'NN00001','10001','1234567890','ADD','A1000','2012-10-01 00:00:00', '2013-09-30 00:00:00',
'NN00001','10001','1234567890','ADD','A1000','2013-01-01 00:00:00', '2013-12-31 00:00:00'
'NN00001','10001','1234567890','LIF','A1000','2012-10-01 00:00:00', '2013-09-30 00:00:00'
'NN00001','10001','1234567890','LIF','A1000','2013-01-01 00:00:00', '2013-12-31 00:00:00'
您可以使用 exists
:
select pc.*
from #productcov pc
where exists (select 1
from #productcov pc2
where pc2.[group] = pc.[group] and -- don't know if this is needed
pc2.member = pc.member and
pc2.product = pc.product and
pc.endtime > pc2.starttime and pc.starttime < pc2.endtime
) ;
注意:您可能需要根据重叠的特定规则将 >
调整为 >=
并将 <
调整为 <=
。
我终于能够自己为我们的生产数据库找出这个审计!我在一个大型查询中使用了多个 Common Table Expressions,Dense_Ranks,Row_Numbers 来解决!稍后将post测试数据查询结果
with cte as (
select distinct
DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim (account),rtrim(member), rtrim(product), rtrim([plan]))) AS [Key Count],
ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime) as [Overlap],
CONCAT(DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan]))), ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime)) as Identifier,
CONCAT(rtrim([group]),rtrim(account),rtrim(member), rtrim(product), rtrim([plan])) as [Key],
StartTime as [Eff Date],
case when EndTime = 0 then '29991231' else EndTime end as [Term Date],
[group],
account,
member,
product,
[plan]
from #productcov
where [group] like 'N%'),
cte2 as (
select distinct
DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim(account),rtrim(member), rtrim(product), rtrim([plan]))) AS [Key Count],
ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime) as [Overlap],
CONCAT(DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan]))), ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime)) as Identifier,
CONCAT(rtrim([group]),rtrim(account),rtrim(member), rtrim(product), rtrim([plan])) as [Key],
StartTime as [Eff Date],
case when EndTime = 0 then '29991231' else EndTime end as [Term Date],
[group],
account,
member,
product,
[plan]
from #productcov
where [group] like 'N%')
select distinct
cte2.[Group],
cte2.[Account],
cte2.[Member],
cte2.[Product],
cte2.[Plan]
from cte
left outer join cte2 on cte.[Key] = cte2.[Key]
where (cte2.[Eff Date] between cte.[Eff Date] and cte.[Term Date]
or cte2.[Term Date] between cte.[Eff Date] and cte.[Term Date])
and cte.[Key Count] = cte2.[Key Count]
and cte.[Identifier] <> cte2.[Identifier]
group by cte2.[Group], cte2.[Account], cte2.[Member], cte2.[Product], cte2.[Plan]
order by cte2.[Group], cte2.[Account], cte2.[Member], cte2.[Product], cte2.[Plan];
create table #productcov
(
[group] varchar(20), -- as business
account varchar(10), -- as business location
member varchar(10), -- as member
product varchar(10), -- as health product
[plan] varchar(10), -- as product type
StartTime datetime, -- as beginning of coverage period
EndTime datetime -- as end of coverage period
)
go
insert into #productcov values
('NN00001','10001','1234567890','ADD','A1000','2010-10-01 00:00:00' , '2012-09-30 00:00:00'),
('NN00001','10001','1234567890','ADD','A1000','2012-10-01 00:00:00' , '2013-09-30 00:00:00'),
('NN00001','10001','1234567890','ADD','A1000','2013-01-01 00:00:00' , '2013-12-31 00:00:00'),
('NN00001','10001','1234567890','ADD','B1000','2010-01-01 00:00:00' , '2014-12-31 00:00:00'),
('NN00001','10001','1234567890','ADD','B1000','2015-01-01 00:00:00' , '2016-12-31 00:00:00'),
('NN00001','10001','1234567890','LIF','A1000','2010-10-01 00:00:00' , '2012-09-30 00:00:00'),
('NN00001','10001','1234567890','LIF','A1000','2012-10-01 00:00:00' , '2013-09-30 00:00:00'),
('NN00001','10001','1234567890','LIF','A1000','2013-01-01 00:00:00' , '2013-12-31 00:00:00'),
('NN00001','10001','1234567890','LIF','B1000','2010-01-01 00:00:00' , '2014-12-31 00:00:00'),
('NN00001','10001','1234567890','LIF','B1000','2015-01-01 00:00:00' , '2016-12-31 00:00:00')
select * from #productcov
上面的示例 table 适用于单个组中的单个成员。我正在尝试 select #productcov table 中十条记录中的第二条、第三条、第七条和第八条记录,其中医疗产品的承保日期与会员产品重叠。这是一个审计过程,用于清理覆盖日期中的重叠数据。 table 中重要的重叠日期需要按组、帐户、成员、产品和计划分组。
几天来我一直在努力寻找解决方案,但一无所获!感谢任何帮助。
所需的输出将是下面列出的 4 条记录:
组、帐户、成员、产品、计划、开始日期、结束日期
'NN00001','10001','1234567890','ADD','A1000','2012-10-01 00:00:00', '2013-09-30 00:00:00',
'NN00001','10001','1234567890','ADD','A1000','2013-01-01 00:00:00', '2013-12-31 00:00:00'
'NN00001','10001','1234567890','LIF','A1000','2012-10-01 00:00:00', '2013-09-30 00:00:00'
'NN00001','10001','1234567890','LIF','A1000','2013-01-01 00:00:00', '2013-12-31 00:00:00'
您可以使用 exists
:
select pc.*
from #productcov pc
where exists (select 1
from #productcov pc2
where pc2.[group] = pc.[group] and -- don't know if this is needed
pc2.member = pc.member and
pc2.product = pc.product and
pc.endtime > pc2.starttime and pc.starttime < pc2.endtime
) ;
注意:您可能需要根据重叠的特定规则将 >
调整为 >=
并将 <
调整为 <=
。
我终于能够自己为我们的生产数据库找出这个审计!我在一个大型查询中使用了多个 Common Table Expressions,Dense_Ranks,Row_Numbers 来解决!稍后将post测试数据查询结果
with cte as (
select distinct
DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim (account),rtrim(member), rtrim(product), rtrim([plan]))) AS [Key Count],
ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime) as [Overlap],
CONCAT(DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan]))), ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime)) as Identifier,
CONCAT(rtrim([group]),rtrim(account),rtrim(member), rtrim(product), rtrim([plan])) as [Key],
StartTime as [Eff Date],
case when EndTime = 0 then '29991231' else EndTime end as [Term Date],
[group],
account,
member,
product,
[plan]
from #productcov
where [group] like 'N%'),
cte2 as (
select distinct
DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim(account),rtrim(member), rtrim(product), rtrim([plan]))) AS [Key Count],
ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime) as [Overlap],
CONCAT(DENSE_RANK() OVER (ORDER BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan]))), ROW_NUMBER() OVER (PARTITION BY CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])) order by CONCAT(rtrim([group]),rtrim(account), rtrim(member), rtrim(product), rtrim([plan])), StartTime)) as Identifier,
CONCAT(rtrim([group]),rtrim(account),rtrim(member), rtrim(product), rtrim([plan])) as [Key],
StartTime as [Eff Date],
case when EndTime = 0 then '29991231' else EndTime end as [Term Date],
[group],
account,
member,
product,
[plan]
from #productcov
where [group] like 'N%')
select distinct
cte2.[Group],
cte2.[Account],
cte2.[Member],
cte2.[Product],
cte2.[Plan]
from cte
left outer join cte2 on cte.[Key] = cte2.[Key]
where (cte2.[Eff Date] between cte.[Eff Date] and cte.[Term Date]
or cte2.[Term Date] between cte.[Eff Date] and cte.[Term Date])
and cte.[Key Count] = cte2.[Key Count]
and cte.[Identifier] <> cte2.[Identifier]
group by cte2.[Group], cte2.[Account], cte2.[Member], cte2.[Product], cte2.[Plan]
order by cte2.[Group], cte2.[Account], cte2.[Member], cte2.[Product], cte2.[Plan];