2015-09-10 69 views
1

在我們的SQL Server 2008數據庫中,「Jobs」表之間存在一對多關係和「歷史」表。每次作業狀態發生變化時,我們都會將狀態,日期時間和作業ID記錄到歷史記錄表格中。如何篩選具有特定狀態的項目的歷史記錄表,但如果項目還具有其他特定狀態,則排除該項目

我需要獲取所有工作ID的歷史狀態=「已發佈」,除非工作歷史還具有狀態=「已撤銷」。

如果一個作業的歷史有一個狀態=「撤銷」,但隨後在日後有一個狀態=「發佈」,它必須包含在結果中。

所以基於以下模擬表中,而上述規則,應返回的結果是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); 

我怎樣寫這個查詢做到這一點?

回答

0

下面是使用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 
) 
+0

謝謝親切 –

相關問題