sql код для сравнения предыдущего ряда в серии - PullRequest
1 голос
/ 21 февраля 2020

Итак, у меня есть таблица, которая имеет ArticleID (GUID), RevisionNumber (целое число) и StatusCode (текст). Статья может иметь любое количество ревизий, но каждый раз при создании новой ревизии StatusCode предыдущей ревизии должен быть «Revised», а StatusCode самой новой ревизии может быть «Active», «Draft» или «Cancelled». Однако данные испорчены, и мне нужно определить, какие записи (из 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 Revision 5, 4 и 2 не соответствуют надлежащему состоянию, а xx-yyyy-yy Revision 0 неверен , Как я могу получить эту информацию из запроса sql, используя sql server 2012?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2020

Чтобы идентифицировать любые ревизии, которые не "пересмотрены", если существует ревизия с более высоким номером.

Тогда кажется, что просто нужно знать, какая последняя ревизия.
A 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')
0 голосов
/ 21 февраля 2020

Вы можете сделать это с левым соединением - для каждой записи мы ищем одну с большей ревизией - как это:

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
...