Entonces tengo una tabla que tiene un ArticleID (GUID), RevisionNumber (entero) y StatusCode (texto). Un artículo puede tener cualquier número de revisiones, pero cada vez que se crea una nueva revisión, el Código de estado de la revisión anterior debe ser "Revisado" y el Código de estado de la revisión más reciente puede ser "Activo" o "Borrador" o "Cancelado". Sin embargo, los datos están desordenados y necesito identificar qué registros (de cada 100 de miles) no tienen el estado correcto. Data de muestra:

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

En el escenario anterior, necesitaría saber que las revisiones 5, 4 y 2 de xx-xxxx-xx no tienen el estado correcto y que la revisión 0 de xx-aaaa-aa es incorrecta. ¿Cómo podría obtener esta información de una consulta SQL usando SQL Server 2012?

1
W.D. K. 21 feb. 2020 a las 19:09

2 respuestas

La mejor respuesta

Para identificar cualquier revisión que no esté "Revisada" si hay una revisión de mayor número.

Entonces parece solo una cuestión de saber cuál es la última revisión.
Un MAX OVER puede hacer eso.

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
LukStorms 21 feb. 2020 a las 17:23

Puede hacer esto con una combinación izquierda: para cada registro buscamos uno con una revisión mayor, como este:

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
0
Hogan 21 feb. 2020 a las 17:32