更新表但是先匹配然后再按秒

时间:2017-01-17 17:53:01

标签: sql sql-server

我有一个历史性的表格,我需要更新当前的表格,但是按照基于列的顺序

首先查看历史记录表上的最后一个日期并更新,并且只有在下一个日期没有匹配更新时才会更新,等等。

我的想法是通过获取最大日期然后以递归方式加入循环直到历史表中的最小日期。

任何意见都将受到高度赞赏。

下面的历史表。现在考虑更新我的表,它的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

2 个答案:

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