Мне нужно создать процесс, который будет извлекать изменения из таблицы, где каждая строка является снимком строки в другой таблице.В реальной проблеме много таблиц со многими полями, но в качестве простого примера предположим, что у меня есть следующие данные снимка:
Sequence DateTaken ID Field1 Field2
-------- ----------- ---- ------ ------
1 '2011-01-01' 1 'Red' 2
2 '2011-01-01' 2 'Blue' 10
3 '2011-02-01' 1 'Green' 2
4 '2011-03-01' 1 'Green' 3
5 '2011-03-01' 2 'Purple' 2
6 '2011-04-01' 1 'Yellow' 2
Поля Sequence
и DateTaken
относятся непосредственно к снимкуСам стол.Поле ID
является первичным ключом исходной таблицы, а Field1
и Field2
- другие поля в той же (исходной) таблице.
Я могу частично получить решение с помощью запросакак это:
WITH Snapshots (Sequence, DateTaken, ID, Field1, Field2, _Index)
AS
(
SELECT Sequence, DateTaken, ID, Field1, Field2, ROW_NUMBER() OVER (ORDER BY ID, Sequence) _Index
FROM #Snapshots
)
SELECT
c.DateTaken, c.ID
, c.Field1 Field1_Current, p.Field1 Field1_Previous, CASE WHEN c.Field1 = p.Field1 THEN 0 ELSE 1 END Field1_Changed
, c.Field2 Field2_Current, p.Field2 Field2_Previous, CASE WHEN c.Field2 = p.Field2 THEN 0 ELSE 1 END Field2_Changed
FROM Snapshots c
JOIN Snapshots p ON p.ID = c.ID AND (p._Index + 1) = c._Index
ORDER BY c.Sequence DESC
Приведенный выше запрос определит, что меняется от одного снимка к другому, но он все еще не в той форме, которая мне нужна.Каждая строка в выводе может содержать несколько изменений.В конце дня мне нужно по одной строке на изменение, которое идентифицирует, какое поле было изменено, вместе с его предыдущими / текущими значениями.Поля, которые фактически не изменились, должны быть исключены из окончательного результата.Поэтому, если приведенный выше запрос выглядит следующим образом:
DateTaken ID Field1_Current Field1_Previous Field1_Changed Field2_Current Field2_Previous Field2_Changed
---------- -- -------------- --------------- -------------- -------------- --------------- --------------
2011-04-01 1 Yellow Green 1 2 3 1
2011-02-01 1 Green Red 1 2 2 0
Мне нужно преобразовать это в нечто вроде этого:
DateTaken ID Field Previous Current
---------- -- ------- -------- ---------
2011-04-01 1 Field1 Green Yellow
2011-04-01 1 Field2 3 2
2011-02-01 1 Field1 Red Green
Я думал, что смогу попасть туда с UNPIVOTно я не смог заставить эту работу.Я считаю, что любое решение, включающее курсоры или подобное, является абсолютным последним средством.
Большое спасибо за любые советы.