2017-10-10 152 views
0

尋找關於如何編寫此代碼的建議。SQL Server:存儲最近5個日期

我有一個唯一值從一個系統移植到另一個系統的表。而且我想存儲一條記錄,說明記錄何時結束的最後5個日期。

因此,例如,項目A在2017年10月1日從系統X刷新到系統Y,我想將此日期存儲在表格中。然後在接下來的一個月裏,它又被帶過4次,所以我希望這些日期值也寫入該表中。

現在過去的5個日期已經寫好了,我需要一些維護代碼的方法,以便任何進入的新日期都會覆蓋表數據,這樣我們最多可以保留最近5個更新日期這張桌子。

示例數據; 日期列表示每個屬性行發生的最後5次更新。

Property ID's, Date 1, Date 2, Date 3, Date 4, Date 5 
1    01/07/17, 01/08/17 01/10/17 05/10/17 10/10/17 
2    01/01/17 01/03/17 01/06/17 05/10/17 10/10/17 
3    01/02/17 05/02/17 01/10/17 05/10/17 10/10/17 
4    01/03/17 01/08/17 01/10/17 

如果物業有4從系統X的更新,日期4被填充。 如果屬性3具有系統x的更新,則日期2至5將向左移動一個位置,並且日期5將填入最新日期。

這是記錄最近5次更新的最佳方式嗎?

或者,我可以將每個屬性ID和更新日期寫入表中,並且有一些清理例程,每個屬性只保留5個條目。

道歉,如果我是模糊的。

+1

總共只有5條記錄,或者組中有5條記錄?假設系統X,Y有5條記錄;系統X,Z的5條記錄; A,B等5條記錄?無論如何,這裏提出問題的好方法是提供樣本數據和預期結果 –

回答

0

更好地利用表所示:

CREATE TABLE dbo.ChangeDates (
    PropertyID int, 
    DateChanged date 
) 

而只是寫數據了。然後創建如下視圖:

CREATE VIEW dbo.Top5ChangeDates 
AS 
WITH cte AS (
    SELECT PropertyID, 
      DateChanged, 
      ROW_NUMBER() OVER (PARTITION BY PropertyID ORDER BY DateChanged DESC) as rn 
    FROM dbo.ChangeDates 
) 

SELECT PropertyID, 
     DateChanged 
FROM cte 
WHERE rn <= 5 
GO 

或者在插入TRIGGER而不是視圖後使用,以清除數據。

+0

好的建議。我認爲我過於複雜的事情 –

0

如果你想保留最近的5條記錄,那麼它好像MERGE,允許同步INSERTDELETE活動可能是要走的路。

這個腳本演示了MERGEID值保留最近的5行:

create table #History (ID int not null, OccurredAt datetime2(7) not null) 
go 
declare @current table (ID int not null) 
insert into @current (ID) values (1),(3) 

;With Keeps as (
    select 
     *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY OccurredAt desc) as rn 
    from #History 
    where ID in (select ID from @current) 
) 
merge into #History t 
using (select ID,SYSDATETIME() from @current 
     union all 
     select ID,OccurredAt from Keeps where rn between 1 and 4) s(ID,OccurredAt) 
on 
    t.ID = s.ID and 
    t.OccurredAt = s.OccurredAt 
when not matched then insert (ID,OccurredAt) values (s.ID,s.OccurredAt) 
when not matched by source and t.ID in (select ID from @current) then delete; 

waitfor delay '00:00:01' 
go 30 
select * from #History 

希望你可以看到CTE如何認定,應保留「其他」行,以及如何在兩個not matched條款然後處理INSERTDELETE活動。

+0

對CTE方面的好建議。將閱讀它。 –

相關問題