SQL:获取最新记录

时间:2010-02-23 12:41:52

标签: sql database sql-server-2005 database-design

这是我的关系模型:

  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获取最新状态/当前状态。

有任何帮助吗?提前谢谢!

5 个答案:

答案 0 :(得分:2)

你改变你的模型......

使用当前方案,随着越来越多的数据发生变化,使用上面建议的查询确定当前状态需要更长时间和更长时间...

您的请求需要“Current_Request_State”属性。

答案 1 :(得分:1)

此查询还应该为您提供所需的内容,但我同意Martin Milan的观点,您应该考虑在Request表上缓存最新的状态值。

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

答案 2 :(得分: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'

答案 3 :(得分: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'

答案 4 :(得分: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子句来过滤特定的请求状态。