2010-02-23 48 views
0

這是我的關係模型:SQL:最新紀錄

Request 
    ------------------------------ 
    RequestId 
    ------------------------------ 
    1 
    2 


    RequestState 
    ------------------------------ 
    RequestStateId | Name 
    ------------------------------ 
    10    | Received 
    20    | Processing 
    30    | Finsihed 


    Request_RequestState 
    ------------------------------------------------------------------- 
    Request_RequestStateId | RequestId | RequestStateId | CreatedOn 
    ------------------------------------------------------------------- 
    1      | 1   | 10    | 2010-01-01 
    2      | 1   | 20    | 2010-01-02 
    3      | 2   | 10    | 2010-01-15 

每次請求的狀態變化,這種變化被存儲。 現在我需要按照當前狀態列出請求。 像「獲取當前狀態的所有請求=接收」。

到目前爲止,我只設法創建一個返回給定狀態的請求的查詢,但不管它是當前狀態還是舊的狀態......所以我不知何故需要使用CreatedOn來獲取最新/當前狀態。

任何幫助?提前致謝!

回答

2

你改變你的模型...

在當前的計劃,隨着越來越多的數據變化發生,這將需要更長的時間和更長的使用上面建議的查詢來確定當前狀態...

您的請求需要「Current_Request_State」屬性。

0

這應該爲你做它:

SELECT  r.RequestId, 
      s.Name AS RequestStateName 
FROM  Request r 
INNER JOIN Request_RequestState rs 
     ON rs.Request_RequestStateId = (
       SELECT TOP 1 x.Request_RequestStateId 
       FROM  Request_RequestState x 
       WHERE  x.RequestId = r.RequestId 
         --// you could add filter to get "current" status at some DATE 
         --//AND x.CreatedOn < '2010-01-15' 
       ORDER BY x.CreatedOn DESC 
      )      
INNER JOIN RequestState s 
     ON s.RequestStateId = rs.RequestStateId 

WHERE  s.Name = 'Received' 

您還可以得到所有「當前」要求一些其他日期的,如果使用過濾器的代碼註釋。

我可能只是創建從上面的SQL查詢視圖,並使用它:

SELECT * FROM MyRequestStateView WHERE RequestStateName = 'Received' 
0

假設Request_RequestStateId增加了時間(以最大的ID,即記錄了最新的CreatedOn日期)。 ...

SELECT rrs.RequestId, rrs.RequestStateId, rs.Name 
FROM Request_RequestState rrs 
    JOIN (
     SELECT MAX(Request_RequestStateId) AS LatestRequestStateId 
     FROM Request_RequestState 
     GROUP BY RequestId 
    ) rrs2 ON rrs.Request_RequestStateId = rrs2.LatestRequestStateId 
    JOIN RequestState rs ON rrs.RequestStateId = rs.RequestStateId 
WHERE rs.Name = 'Received' 
0

一個可能的查詢可能看起來像:

select r.requestId, 
rs.RequestStateId, 
rs.Name, 
rrs.CreatedOn 
from (select r2.* from request_requeststate where r2.createdon = (select max(createdon) from request_requeststate r3 where r3.request_requeststateId = r2.request_requeststateId)) rrs 
inner join requeststate rs on rs.requeststateId = rrs.reqeststateid 
inner join request r on r.requestid = rrs.requestid 

您可以使用此查詢作爲視圖或添加where子句,在其中篩選特定請求狀態。

1

這個查詢也應該給你你想要的,但我也同意Martin Milan你應該考慮在請求表上緩存最新的狀態值。

SELECT r.RequestId, rrs.RequestStateId, rs.RequestStateName, rrs.StateChangedDate 
FROM Request r 
    INNER JOIN (
     SELECT ROW_NUMBER() OVER (PARTITION BY RequestId ORDER BY CreatedOn DESC) AS ROWNUM, 
       RequestId, 
       RequestStateId 
       CreatedOn 
     FROM Request_RequestState  
    ) rrs 
     ON r.RequestId = rrs.RequestId 
     AND ROWNUM = 1 
    INNER JOIN RequestState rs 
     ON rrs.RequestStateId = rs.REquestStateId