如何过滤具有特定状态的项目的历史记录 table,但如果该项目也具有其他特定状态则排除该项目

How do I filter a history table for items that had a specific status but exclude that item if it also had another specific status

在我们的 SQL Server 2008 数据库中,"Jobs" table 和 "History" table 之间存在一对多关系。每次更改作业状态时,我们都会将状态、日期时间和作业 ID 记录到历史记录中 table。

我需要获取历史状态为“已发布”的所有作业 ID 除非作业历史的状态也为“已撤销”。

如果作业的历史记录状态为“已撤销”,但在以后的状态为“已发布”,则它必须包含在结果中.

所以根据下面的模型 table 和上面的规则,应该返回的结果是 FK_JobID 的 2 和 3。

DECLARE @History TABLE 
( 
    HistoryID   INT IDENTITY(1,1), 
    MaterStatus VARCHAR(300), 
    Updated     DATETIME, 
    FK_JobID    INT
)

INSERT INTO @History 
VALUES ('Issued','2015-09-09',1), 
       ('Revoked','2015-09-09',1),
       ('Issued','2015-09-09',2),
       ('Archived','2015-09-09',2),
       ('Issued','2015-09-09',3),
       ('Revoked','2015-09-09',3),
       ('Issued','2015-09-10',3),
       ('other','2015-09-09',4);

如何编写此查询来执行此操作?

这是一种使用 CTE 获取状态发布的最新时间并使用 NOT EXISTS 子句过滤掉那些被撤销的结果的方法。

;With RecentStatuses As 
(
    Select  FK_JobId, MaterStatus, Max(Updated) Recent
    From    @History
    Group by FK_JobID, MaterStatus
)
Select  H1.FK_JobID
From    RecentStatuses  H1
Where   H1.MaterStatus = 'Issued'
And Not Exists
(
    Select  *
    From    RecentStatuses  H2
    Where   H2.FK_JobID = H1.FK_JobID
    And     H2.MaterStatus = 'Revoked'
    And     H2.Recent >= H1.Recent
)