【问题标题】:SQL: Get latest recordSQL:获取最新记录
【发布时间】:2010-02-23 12:41:52
【问题描述】:

这是我的关系模型:

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

有什么帮助吗?提前致谢!

【问题讨论】:

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


    【解决方案1】:

    你改变你的模型...

    使用当前方案,随着越来越多的数据更改发生,使用上面建议的查询来确定当前状态将花费越来越长的时间......

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

    【讨论】:

      【解决方案2】:

      这个查询也应该给你你想要的,但我也同意 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
      

      【讨论】:

        【解决方案3】:

        这应该为你做:

        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'
        

        【讨论】:

          【解决方案4】:

          假设 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'
          

          【讨论】:

            【解决方案5】:

            可能的查询可能如下所示:

            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 子句,以过滤特定的请求状态。

            【讨论】:

              猜你喜欢
              • 2012-02-12
              • 1970-01-01
              • 1970-01-01
              • 2016-10-15
              • 2020-02-28
              • 1970-01-01
              • 1970-01-01
              • 2016-05-15
              相关资源
              最近更新 更多