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?
2 respuestas
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')
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
Nuevas preguntas
tsql
T-SQL (Transact Structured Query Language) es la extensión de la funcionalidad SQL compatible con Sybase ASE y Microsoft SQL Server. No utilice esta etiqueta para consultas relacionadas con MySQL, PostgreSql, Oracle (Pl / SQL). Tenga en cuenta que el código SQL que se está escribiendo usando LINQ no será también parte de esta etiqueta. Esta etiqueta creada específicamente para la programación avanzada de SQL con Microsoft SQL Server.