2011-01-14 7 views
0

監査テーブルを使用して、 '2011-01-01 08:00:00.000'で実行された単一の破壊的なSQL文を記録しています。各MyTableレコードは、スクリプトが実行されたこの日に一度更新されたものとみなすことができます。このSQLはおそらくユーザーによって実行されたため、取得できませんでした。 MyTableに変更が加えられるたびに、新しい値の監査証跡がAuditMyTableに格納されます。SQLで監査証跡を使用して破棄されたデータ行を見つける方法

私の元のテーブルスキーマ:

MyTable(AccountId int PK, Amount int) 

MyTableとスキーマのための私の監査証跡表:

AuditMyTable(AccountId int, Amount int, AuditDate datetime) 

私の質問は、私は私ができるように、それ自体に対してAuditMyTableから参加するSQLを記述しない方法です以下のデータを入手してください。

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

+0

あなたにのみ関心があります既知の時間に1つの特定のレコードまたはテーブル全体? –

+0

本質的に、SQLが実行された時刻より前の値を持つレコードPKのリストを発見しようとしましたが、実行された時点でヌルになっていました。 – mirezus

答えて

0

まず、あなたは(私は、彼らは厳密に増加していると仮定すると、あなたの日付から1を作ってるんだ)あなたのシーケンスを取得する必要があります。

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 
関連する問題