如何过滤具有特定状态的项目的历史记录 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
)
在我们的 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
)