背景/设置:
我正在使用SQL Server 2008 R2;在我的存储过程中的当前点我正在使用临时表#benefits。我的最终目标是从字段更改列表中创建覆盖图。
以下示例表包含可能发生的覆盖范围更改的所有不同方案(最糟糕的情况)。我正在使用的表可以这样模拟:
declare @tmp table ([File_Name] nvarchar(3), File_Key int, Plan_Num nvarchar(4), Eff_Date datetime, Term_Date datetime)
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'A', '1/1/2014') -- Always delete this row, CLM is not yet A
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('CLM', 1, 'A', '2/1/2014')
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'D', '3/1/2014')
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'A', '4/1/2014')
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('CLM', 1, 'D', '5/1/2014')
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'D', '6/1/2014') -- Always delete this row, CLM is D
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'A', '7/1/2014') -- Always delete this row, CLM is D
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('CLM', 1, 'A', '8/1/2014')
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('CLM', 1, 'D', '9/1/2014') -- Key record (Remove for 2nd scenario)
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'D', '1/1/2015') -- If the key record exists delete this row, else keep
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'A', '2/1/2015') -- If the key record exists delete this row, else keep
insert into @tmp ([File_Name], File_Key, Plan_Num, Eff_Date) values ('IND', 1, 'D', '3/1/2015') -- If the key record exists delete this row, else keep
问题:
在我使用的系统中,父记录可以激活或终止子记录的覆盖范围,而无需实际修改子记录。因此,我必须将父记录[IND]的字段更改与子记录[CLM]结合起来,以获得完整的地图。
需要帮助:
我需要帮助的是删除我不需要的[IND]记录。我只想保留最后[CLM]更改的代码值为A(活动)时发生的[IND]更改。其中一个样本记录被标记为密钥记录,并且基于它的存在,覆盖图将发生变化。以下是有和没有密钥记录的所需覆盖图。
我需要删除: 1)CLM A和后续CLM D记录之间发生的所有IND记录 2)在CLM D记录之后出现且没有后续A记录的所有IND记录
删除了不需要的[IND]记录后,我需要使用之前值的生效日期填充Term_Date。我有代码要做,但它需要添加Identity(1,1)列和自联接更新。
alter table #benefits add RowID int identity(1,1)
update a set a.term_date = b.eff_date from #benefits a, #benefits b where a.file_key = b.file_key and a.RowID = b.RowID - 1
我很确定使用CTE可以实现同样的目标,但我对它们并不熟悉。
谢谢。
关键记录的预期结果:
CLM 1 A 2/1/2014 3/1/2014
IND 1 D 3/1/2014 4/1/2014
IND 1 A 4/1/2014 5/1/2014
CLM 1 D 5/1/2014 8/1/2014
CLM 1 A 8/1/2014 9/1/2014
CLM 1 D 9/1/2014 null
没有密钥记录的预期结果:
CLM 1 A 2/1/2014 3/1/2014
IND 1 D 3/1/2014 4/1/2014
IND 1 A 4/1/2014 5/1/2014
CLM 1 D 5/1/2014 8/1/2014
CLM 1 A 8/1/2014 1/1/2015
IND 1 D 1/1/2015 2/1/2015
IND 1 A 2/1/2015 3/1/2015
IND 1 D 3/1/2015 NULL
答案 0 :(得分:0)
这是一个部分解决方案,它会给你带来空白,我会问你是否想要差距?如果是这样,它可以用另一种方式修复。
第一部分删除具有Plan_Num D的CLM的IND。
delete a
from #benefits a
left join #benefits b
on a.rowid = b.rowid -1
where a.file_name = 'IND'
and b.file_name = 'CLM'
and b.Plan_num = 'D'
update a set a.term_date = b.eff_date
from #benefits a
left join #benefits b
on a.rowid = b.rowid -1
答案 1 :(得分:0)
这应删除你不想要的记录来自@tmp
DELETE t FROM @tmp t
WHERE t.File_Name = 'IND'
AND ISNULL((SELECT TOP 1 Plan_Num FROM @tmp WHERE File_Name = 'CLM' AND Eff_Date < t.Eff_Date ORDER BY Eff_Date DESC),'D') = 'D'