sql 比较系列中前一行的代码

sql code to compare previous row in a series

所以我有一个 table,它有一个 ArticleID (GUID)、RevisionNumber(整数)和 StatusCode(文本)。 一篇文章可以有任意数量的修订,但每次创建新修订时,前一个修订的 StatusCode 应该是 "Revised",最新修订的 StatusCode 可以是 "Active" 或 "Draft" 或 "Canceled"。然而,数据被搞砸了,我需要确定哪些记录(成千上万的记录中的 100 条记录)没有正确的状态。 示例数据:

Article ID     RevisionNumber     StatusCode
==========     ==============     ==========
xx-xxxx-xx            7             Active
xx-xxxx-xx            6            Revised
xx-xxxx-xx            5             Active
xx-xxxx-xx            4              Draft
xx-xxxx-xx            3            Revised
xx-xxxx-xx            2             Active
xx-xxxx-xx            1            Revised
xx-xxxx-xx            0            Revised
xx-yyyy-yy            1             Active
xx-yyyy-yy            0             Active

在上述情况下,我需要知道 xx-xxxx-xx 修订版 5、4 和 2 不是正确的状态,而 xx-yyyy-yy 修订版 0 不正确。我如何使用 sql 服务器 2012 从 sql 查询中获取此信息?

您可以使用左连接来做到这一点——对于每条记录,我们寻找一个具有更大修订的记录——就像这样:

SELECT *
FROM table_you_did_not_name base
LEFT JOIN table_you_did_not_name next ON base.ArticleID = next.ArticleID and base.revisionnumber = next.revisionnumber + 1
WHERE status <> 'Revised' and next.ArticleID is not null

如果有更高编号的修订,则识别不是 "Revised" 的任何修订。

那么看来只要知道最新的版本是多少就好了。
MAX OVER 可以做到这一点。

SELECT ArticleID, RevisionNumber, StatusCode
FROM
(
    SELECT ArticleID, RevisionNumber, StatusCode
    , MAX(RevisionNumber) OVER (PARTITION BY ArticleID) AS MaxRevisionNumber
    FROM YourTable
) q
WHERE (RevisionNumber < MaxRevisionNumber AND StatusCode != 'Revised')