我有一个历史性的表格,我需要更新当前的表格,但是按照基于列的顺序
首先查看历史记录表上的最后一个日期并更新,并且只有在下一个日期没有匹配更新时才会更新,等等。
我的想法是通过获取最大日期然后以递归方式加入循环直到历史表中的最小日期。
任何意见都将受到高度赞赏。
下面的历史表。现在考虑更新我的表,它的S_Numb为18992所以没有匹配,但如果它的1891它应该更新ABC1。表中没有要更新的日期字段。
S_Numb S_Name S_date
19891 ABC1 2017-01-13
19891 ABC2 2017-01-06
19891 ABC3 2016-12-30
11631 ABC2 2016-12-16
11631 ABC3 2016-12-09
11631 ABC4 2016-12-02
11631 ABC5 2016-11-25
11631 ABC6 2016-11-18
11631 ABC7 2016-11-11
13213 ABC1 2016-11-04
13213 ABC2 2016-10-28
13213 ABC3 2016-10-21
13213 ABC4 2016-10-14
13213 ABC5 2016-10-07
13213 ABC6 2016-09-30
13213 ABC7 2016-09-16
答案 0 :(得分:1)
您可以使用public_content
获取最新值,如下所示:
交叉apply :
cross apply
更新了问题更新的一些代码评论:
--update c set c.ColumnToUpdate = x.ColumnToUpdate
select x.ColumnToUpdate, c.*
from Current as c
cross apply (
select top 1
h.ColumnToUpdate
from History
where h.Id = c.Id
order by h.Date desc
) as x
where c.ColumnToUpdate != x.ColumnToUpdate;
答案 1 :(得分:0)
我们可以使用一些示例数据,但假设两个表中的每一行都有一个名为SomeID的ID,并且历史表中有一个名为YourCreatedTimeStamp的时间戳,并且您希望在名为SomeField的字段中更新该值...
update CurrentTable
set SomeField =
(
select SomeField
from HistoricTable
inner join
(
select
SomeId
,max(YourCreatedTimeStamp) as LastCreatedTS
from HistoricTable
group by SomeId
) LastEntryForEachId
on HistoricTable.SomeId = LastEntryForEachId.SomeId
and HistoricTable.YourCreatedTs = LastEntryForEachId.LastCreatedTs)
where SomeId = [The Id You Are Interested in Updating)