Как найти уничтоженные строки данных, используя контрольный журнал с SQL - PullRequest
0 голосов
/ 14 января 2011

Я использую таблицу аудита, чтобы найти, в каких записях один деструктивный оператор SQL выполнялся, скажем, «2011-01-01 08: 00: 00.000».Можно предположить, что каждая запись MyTable обновлялась только один раз в этот день, когда выполнялся скрипт.Этот SQL, вероятно, был запущен пользователем и не может быть получен.Каждый раз, когда происходит изменение в MyTable, журнал аудита нового значения сохраняется в AuditMyTable.

Моя исходная схема таблицы:

MyTable(AccountId int PK, Amount int)

Моя таблица журнала аудита для схемы MyTable:

AuditMyTable(AccountId int, Amount int, AuditDate datetime)

Мой вопрос заключается в том, как мне написать SQL-соединение из AuditMyTable для себя, чтобы я мог получить следующие данные:

AuditMyTable.AccountId, AuditMyTable.Amount as [NullAmount], AuditMyTablePrevious.Amount as [PreviousNotNullAmount]

1 Ответ

0 голосов
/ 14 января 2011

Сначала вы должны получить свою последовательность (я делаю одну из ваших дат, предполагая, что они строго увеличиваются):

SELECT AccountId, cur.AuditDate AS cur_AuditDate, MAX(prev.AuditDate) AS prev_AuditDate
FROM AuditMyTable AS cur
LEFT JOIN AuditMyTable AS prev
    ON prev.AccountId = cur.AccountId
    AND prev.AuditDate < cur.AuditDate
GROUP BY AccountId, cur.AuditDate

Затем используйте ее:

WITH Ordering AS (
    SELECT AccountId, cur.AuditDate AS cur_AuditDate, MAX(prev.AuditDate) AS prev_AuditDate
    FROM AuditMyTable AS cur
    LEFT JOIN AuditMyTable AS prev
        ON prev.AccountId = cur.AccountId
        AND prev.AuditDate < cur.AuditDate
    GROUP BY AccountId, cur.AuditDate
)
SELECT cur.AccountId, cur.Amount as [NullAmount], prev.Amount as [PreviousNotNullAmount]
FROM AuditMyTable AS cur
INNER JOIN Ordering
    ON Ordering.AccountId = cur.AccountId
    AND Ordering.cur_AuditDate = cur.Audit_Date
LEFT JOIN AuditMyTable AS prev
    ON prev.AccountId = cur.AccountId
    AND prev.Audit_Date = Ordering.prev_AuditDate
...