2015-11-02 43 views
0

update運行作爲存儲proceducre即會insertupdate記錄在我的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 TermDate列了一堆記錄時從MAX(InformationID)返回的記錄有更大的EffDate

所以,假設以下

1)記錄與2015年11月2日EffDate進入

2)記錄與2015年9月1日EffDate

3)進入記錄與2015年10月3日輸入EffDate

4)記錄與09/15/201輸入5 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最接近但不小於另一個記錄的EffDate並將該值指定爲另一個記錄的TermDate?

我已經刪除了InformationID的檢查,以確保它們不相同; InformationID <> @aInformationID但除此之外,我無法弄清楚如何得到「最接近」的日期。

+1

請編輯您的問題,並提供樣本數據和所需的結果。 –

回答

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; 
+0

這沒有考慮到「最接近EffDate」的要求,是嗎?我重新編輯了我的文章,以更清晰的當前數據樣本以及它應該如何*,而不是。基本上,如果您插入3個日期,則「最老」記錄應該具有「中值」記錄的日期,而不僅僅是「最新」記錄的日期。 – sab669

相關問題