2014-07-14 42 views
0

我有一種情況,在過去的某個時間點,表中的某些記錄被修改爲具有重複的信息。如何從日誌中獲取以前的值

考慮下面的例子:

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'); 

最初 「客戶1」 和 「客戶2」 CustomerValue柱具有不同的值在[#CustomerExample]表中的每個記錄。然而,由於缺乏適當的唯一約束,一堆「壞」的UPDATE語句導致了重複的信息。更新記錄到[#CustomerExampleLog]表中,該表僅包含更新記錄的標識,更新日期和新值。我的目標是重新記錄日誌條目並將其中一個副本恢復爲它的「最後已知的好」價值,然後它變成了一個騙局。

理想情況下,我想將其中一個隱藏的CurrentCustomerValue還原爲以前的值。在上面的例子中,CustomerRecordId = 1的LogId = 3,CustomerRecordId = 3的LogId = 15。

我完全難住了。

回答

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

我知道我在使用RANK()和其他東西讓自己太複雜:)謝謝,這正是我所需要的! – Chahk

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); 
相關問題