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')
所以我有一个 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')