2009-06-26 85 views
45

我正在为我的项目团队创建状态板模块。状态板允许用户将他们的状态设置为或不在状态,并且还可以提供注释。我打算存储在单个表中的所有信息......,并遵循示例中的数据:创建SQL查询以检索最近的记录

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来做到这一点?任何帮助,将不胜感激。

+2

哈哈哈......星舰时间表。 – 2013-10-26 08:03:15

回答

63

汇总在 子查询 派生表中,然后加入到它。

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 
+4

这被称为派生表。 – SurroundedByFish 2009-06-26 16:56:09

+0

完美地工作:-) – Fox 2013-05-15 07:15:57

+5

如果派生表结尾重复{LatestDate,User} – alphadogg 2013-11-07 14:11:26

41

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

只有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; 
7

派生表的工作,但如果这是SQL 2005,CTE和ROW_NUMBER可能更清洁:

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 

这也会促进dis播放每个用户最近的x个状态。

4

另一个简单的方法:

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