代码之家  ›  专栏  ›  技术社区  ›  mattruma

创建SQL查询以检索最新记录

  •  50
  • mattruma  · 技术社区  · 16 年前

    我正在为我的项目团队创建状态板模块。状态板允许用户将其状态设置为输入或输出,还可以提供注释。我计划把所有的信息存储在一张表中…数据示例如下:

    Date               User         Status    Notes
    -------------------------------------------------------
    1/8/2009 12:00pm   B.Sisko      In        Out to lunch    
    1/8/2009 8:00am    B.Sisko      In  
    1/7/2009 5:00pm    B.Sisko      In    
    1/7/2009 8:00am    B.Sisko      In    
    1/7/2009 8:00am    K.Janeway    In   
    1/5/2009 8:00am    K.Janeway    In    
    1/1/2009 8:00am    J.Picard     Out       Vacation  
    

    我想查询数据并返回每个用户的最新状态,在这种情况下,我的查询将返回以下结果:

    Date               User         Status    Notes
    -------------------------------------------------------  
    1/8/2009 12:00pm   B.Sisko      In        Out to lunch    
    1/7/2009 8:00am    K.Janeway    In   
    1/1/2009 8:00am    J.Picard     Out       Vacation  
    

    我正试图找出Transact-SQL来实现这一点?任何帮助都将不胜感激。

    4 回复  |  直到 8 年前
        1
  •  69
  •   Michael Buen    15 年前

    集合中的集合 子查询 派生表,然后联接到它。

     Select Date, User, Status, Notes 
        from [SOMETABLE]
        inner join 
        (
            Select max(Date) as LatestDate, [User]
            from [SOMETABLE]
            Group by User
        ) SubMax 
        on [SOMETABLE].Date = SubMax.LatestDate
        and [SOMETABLE].User = SubMax.User 
    
        2
  •  50
  •   Pure.Krome    8 年前

    另一种方法是,如果使用子查询,只扫描一次表,而不是两次

    仅限SQL Server 2005及更高版本

    select Date, User, Status, Notes 
    from (
           select m.*, row_number() over (partition by user order by Date desc) as rn
           from [SOMETABLE] m
         ) m2
    where m2.rn = 1;
    
        3
  •  7
  •   2 revs, 2 users 71%<br/>Ira Pfeifer&#13; &#13;    15 年前

    派生表可以工作,但如果这是SQL 2005,则CTE和行编号可能更干净:

    WITH UserStatus (User, Date, Status, Notes, Ord)
    as
    (
    SELECT Date, User, Status, Notes, 
         ROW_NUMBER() OVER (PARTITION BY User ORDER BY Date DESC)
    FROM [SOMETABLE]
    )
    
    SELECT User, Date, Status, Notes from UserStatus where Ord = 1
    

    这也有助于显示每个用户最近的X状态。

        4
  •  5
  •   wpercy    9 年前

    另一个简单的方法:

    SELECT Date, User, Status, Notes  
    FROM Test_Most_Recent 
    WHERE Date in ( SELECT MAX(Date) from Test_Most_Recent group by User)
    
    推荐文章