2012-08-30 28 views
4

我有一个表,它的数据是这样的:TSQL -group由最大的datetime行

id   name  date 
--------- --------- ---------- 
1   a   2012-08-30 10:36:27.393 
1   b   2012-08-30 14:36:27.393 
2   c   2012-08-30 13:36:27.393 
2   d   2012-08-30 16:36:27.393 

我获取最大的datetime与此查询:

SELECT id,Max(date) as mymaxdate 
FROM table1 
group by id 

这个查询givse我两行是这样的:

1  2012-08-30 14:36:27.393 
2  2012-08-30 16:36:27.393 

这是正确的,但我怎么能改变它来检索这个结果?

1 b 2012-08-30 14:36:27.393 
2 d 2012-08-30 16:36:27.393 

感谢

回答

8

对于SQL Server 2005+

WITH cteMaxDate AS (
    SELECT id, name, date, 
      ROW_NUMBER() OVER(PARTITION BY id ORDER BY date DESC) AS RowNum 
     FROM table1 
) 
SELECT id, name, date 
    FROM cteMaxDate 
    WHERE RowNum = 1; 
+0

感谢它很好,你可以告诉我如何将其更改为实体查询? – motevalizadeh

+0

@motevallizadeh:我不能。我甚至不确定像使用CTE这样的东西是否会转化。也许你可以为转换创建一个新问题。 –

2

选项之一:

select 
    t1.id 
    ,t1.name 
    ,t1.date 
from 
    table1 t1 
    inner join (
     SELECT id,Max(date) as mymaxdate 
     FROM table1 
     group by id 
    ) mt1 
     on t1.id = mt1.id 
     and t1.date = mt1.mymaxdate 
+0

如果有id的组内的最大日关系这将返回多余的行。由于最初的尝试涉及GROUP BY,我假定海报只需要一行。 – GilM

+0

感谢它工作良好你能告诉我如何将其更改为实体查询吗? – motevalizadeh

+0

@GilM,这是真的 - 但那么你需要定义条件哪个行名称选择时,有两个具有相同的日期,如果这是不相关的,乔的答案是最好的。否则,您可以根据标准以max(name)或min(name)将结果包装到另一个组中。 – kristof