Audit
根據之前的行合併一行數據
我正在嘗試從審計日誌中建構一個歷史表(最終建構一個類型 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