此update
作为存储过程的一部分运行,insert
或update
我Information
表中的记录:
UPDATE [Information] SET
[TermDate] = @aEffDate
WHERE [InformationID] = (SELECT ISNULL(MAX(InformationID),0)
FROM Information
WHERE InformationID < @aInformationID
AND [DeletedBy] IS NULL
AND [DeletedOn] IS NULL
AND Code = @aCode)
基本上,它会查找第二个最新记录(基于ID)并将该记录TermDate
设置为当前记录的EffDate
。问题在于,这假定用户以最旧到最新的顺序输入记录。
我已在上面的嵌套select
语句中添加了另一个子句,以包含AND EffDate < @aEffDate
,这可确保日期不会被正确终止。但是,现在,当null
返回的记录具有更大MAX(InformationID)
EffDate
TermDate列的记录
所以,假设以下
1)使用11/02/2015 EffDate输入的记录
2)与2015年9月1日输入的记录EffDate
3)使用10/03/2015 EffDate输入的记录
4)记录于2015年9月15日输入EffDate
数据库看起来会这样:
InformationID | EffDate | TermDate --------------------------------------------- 1 | 11/02/15 | 09/01/15 2 | 09/01/15 | 10/03/15 3 | 10/03/15 | 09/15/15 4 | 09/15/15 | NULL
但它应该是这样的:
InformationID | EffDate | TermDate --------------------------------------------- 1 | 11/02/15 | NULL 2 | 09/01/15 | 09/15/15 3 | 10/03/15 | 11/02/15 4 | 09/15/15 | 10/03/15
用户应该按照2,4,3,1的顺序输入记录,这会为每条记录分配适当的TermDate。但不幸的是,我们无法真正强迫他们这样做。
问题如何让EffDate最接近但不低于另一条记录的EffDate,并将该值指定为另一条记录的TermDate?
我已取消InformationID
的支票,只是为了确保它们不相同; InformationID <> @aInformationID
但除此之外,我无法弄清楚如何获得最近的&#34;日期。
答案 0 :(得分:0)
使用窗口函数和可更新的CTE /子查询。作为您问题的正式答案,这应该是倒数第二个记录:
with toupdate as (
select i.*,
row_number() over (order by effdate desc) as seqnum
from Information
where DeletedBy IS NULL and DeletedOn IS NULL and Code = @aCode
)
update toupdate
set TermDate = @aEffDate
where seqnum = 2;