Audit

根據之前的行合併一行數據

  • September 8, 2016

我正在嘗試從審計日誌中建構一個歷史表(最終建構一個類型 2 維表)。不幸的是,審計日誌只記錄正在更改的特定欄位。這是我所說的一個粗略的例子;

CREATE TABLE Staff(
 [ID] int, 
 [Surname] varchar(5), 
 [FirstName] varchar(4), 
 [Office] varchar(9), 
 [Date] varchar(10)
);

INSERT INTO Staff ([ID], [Surname], [FirstName], [Office], [Date])
VALUES
 (001, 'Smith', 'Bill', 'Melbourne', '2015-01-01'),
 (001, NULL, NULL, 'Sydney', '2015-03-01'),
 (002, 'Brown', 'Mary', 'Melbourne', '2014-04-01'),
 (002, 'Jones', NULL, 'Adelaide', '2014-05-01'),
 (002, NULL, NULL, 'Sydney', '2015-01-01'),
 (002, NULL, NULL, 'Perth', '2015-03-01');

特定工作人員的第一個條目是創建他們的記錄的時間,每個後續記錄都是更新…但僅顯示對已更新欄位的更新*。我想用目前員工記錄的其餘部分“填寫”更新行。即,這樣的結果;

001, Smith, Bill, Melbourne, 2015-01-01
001, Smith, Bill, Sydney, 2015-03-01
002, Brown, Mary, Melbourne, 2014-04-01
002, Jones, Mary, Adelaide, 2014-05-01
002, Jones, Mary, Sydney, 2015-01-01
002, Jones, Mary, Perth, 2015-03-01

我知道我可以使用while循環或 a來做到這一點,cursor但我懷疑可能有一個性能更高的選項。


  • NULL 始終表示“值沒有改變”而不是“值更改為 NULL”。

我能夠使用遞歸 CTE 來做到這一點,所以它與游標沒有什麼不同。此外,這些也不能很好地擴展到大容量。看看程式碼,看看你的想法。

;WITH cte AS (
SELECT 0 x, Change, ID, Surname, FirstName, Office, [Date]
FROM dbo.Staff
WHERE Change = 0

UNION ALL

SELECT x + 1, s.Change, c.ID, ISNULL( s.Surname, c.Surname ) , ISNULL( s.FirstName, c.FirstName ), ISNULL( s.Office, c.Office ), s.[Date]
FROM cte c
   INNER JOIN dbo.Staff s ON c.ID = s.ID
WHERE s.Change = c.x
)
SELECT Change, ID, Surname, FirstName, Office, [Date]
FROM  cte
WHERE x > 0
ORDER BY ID, x

引用自:https://dba.stackexchange.com/questions/148641