SQL帮助 - 按顺序删除基于其他记录的记录

时间:2015-06-15 17:30:34

标签: sql sql-server sql-server-2008-r2

背景/设置:

我正在使用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

2 个答案:

答案 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'