2010-02-23 7 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 
관련 문제