0

監査テーブルを使用して、「2011-01-01 08:00:00.000」で実行された単一の破壊的な SQL ステートメントを記録するものを見つけています。スクリプトが実行されたこの日に、各 MyTable レコードが 1 回だけ更新されたと想定できます。この SQL はおそらくユーザーによって実行されたものであり、取得できません。MyTable が変更されるたびに、新しい値の監査証跡が AuditMyTable に保存されます。

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

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]

4

1 に答える 1

0

まず、シーケンスを取得する必要があります (日付が厳密に増加していると仮定して、日付からシーケンスを作成しています)。

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
于 2011-01-14T17:28:16.427 に答える