0

我正在使用审计表来查找在“2011-01-01 08:00:00.000”上运行的单个破坏性 SQL 语句的记录。您可以假设每个 MyTable 记录在脚本运行的这一天只更新一次。此 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 回答