如何从日志中获取以前的值

时间:2014-07-14 14:23:33

标签: sql sql-server sql-server-2008-r2

我有一种情况,在过去的某个时刻,表中的某些记录被修改为具有重复的信息。

考虑以下示例:

create table #CustomerExample
(
   CustomerRecordId int,
   CustomerId int,
   CustomerName varchar(255),
   CurrentCustomerValue varchar(255)
);

create table #CustomerExampleLog
(
   LogId int,
   CustomerRecordId int,
   CustomerId int,
   LogCreateDate datetime,
   NewCustomerValue varchar(255)
);

insert #CustomerExample
values
(1, 100, 'Customer 1', 'Value X'),
(2, 100, 'Customer 1', 'Value X'),
(3, 200, 'Customer 2', 'Value Z'),
(4, 200, 'Customer 2', 'Value Z'),
(5, 200, 'Customer 2', 'Value Z');

insert #CustomerExampleLog
values
(1, 1, 100, '1/1/2014', 'Value B'),
(2, 1, 100, '2/1/2014', 'Value C'),
(3, 1, 100, '3/1/2014', 'Value B'),
(4, 1, 100, '4/1/2014', 'Value X'),
(5, 1, 100, '5/1/2014', 'Value X'),
(6, 1, 100, '6/1/2014', 'Value X'),
(7, 2, 100, '1/1/2014', 'Value D'),
(8, 2, 100, '2/1/2014', 'Value E'),
(9, 2, 100, '3/1/2014', 'Value F'),
(10, 2, 100, '4/1/2014', 'Value G'),
(11, 2, 100, '5/1/2014', 'Value X'),
(12, 2, 100, '6/1/2014', 'Value X'),
(13, 3, 200, '1/2/2014', 'Value A'),
(14, 3, 200, '1/3/2014', 'Value A'),
(15, 3, 200, '1/4/2014', 'Value B'),
(16, 3, 200, '1/5/2014', 'Value Z'),
(17, 4, 200, '1/2/2014', 'Value A'),
(18, 4, 200, '1/3/2014', 'Value A'),
(19, 4, 200, '1/4/2014', 'Value Z');

对于[#CustomerExample]表中的每条记录,最初“客户1”和“客户2”在CustomerValue列中具有不同的值。但是,由于缺少适当的唯一约束,一堆“坏”UPDATE语句导致重复信息。更新记录到[#CustomerExampleLog]表中,该表仅包含更新记录的ID,更新日期和新值。我的目标是重新跟踪日志条目,并在其成为欺骗之前将其中一个重复项还原为它的“最后知道好”值。

理想情况下,我想将其中一个dupes的CurrentCustomerValue恢复为之前的值。在上面的示例中,对于CustomerRecordId = 1,LogId = 3,对于CustomerRecordId = 3,LogId = 15。

我完全被难倒了。

2 个答案:

答案 0 :(得分:1)

你想要这样的东西吗?

SELECT  *
, prev_value = (
    SELECT TOP 1 NewCustomerValue 
    FROM #CustomerExampleLog l 
    WHERE c.CustomerRecordId = l.CustomerRecordId 
    AND l.NewCustomerValue <> c.CurrentCustomerValue 
    ORDER BY LogCreateDate DESC
   )
FROM    #CustomerExample c

答案 1 :(得分:0)

如果您希望有选择地(一次一条记录),这将更新值。

UPDATE Customerexample
   SET Currentcustomervalue = a.Newcustomervalue
  FROM Customerexamplelog a
 WHERE Logid IN(SELECT MAX(Logid)
                  FROM Customerexamplelog L
                       INNER JOIN Customerexample C ON L.Customerrecordid = C.Customerrecordid
                                                   AND L.Newcustomervalue <> C.Currentcustomervalue
                 WHERE L.Customerrecordid = @custid);