2013-07-16 58 views
0

我想选择按日期排序的前3条记录,以便记录不具有相同ID,对于具有相同ID的两条(或更多条)记录,请选择最新。表是这样的:从列中选择具有唯一值的列中的行

ID | Date     | Value 
1 | 2013-04-29T16:27:20 | value1 
2 | 2013-04-29T19:46:25 | value2 
2 | 2013-04-30T16:50:30 | value3 
3 | 2013-04-30T16:40:30 | value4 
1 | 2013-04-30T17:50:30 | value5 

我想要的结果是这样的:

ID | Date     | Value 
1 | 2013-04-30T17:50:30 | value5 
2 | 2013-04-30T16:50:30 | value3 
3 | 2013-04-30T16:40:30 | value4 

回答

0

由于您使用的SQL Server 2005+就可以实现row_number()得到结果:

select id, date, value 
from 
(
    select id, date, value, 
    row_number() over(partition by id order by date desc) seq 
    from yourtable 
) d 
where seq = 1; 

请参阅SQL Fiddle with Demo

或者你可以使用子查询与聚合函数与最近的日期返回id

select t1.id, t1.date, t1.value 
from yourtable t1 
inner join 
(
    select id, max(date) date 
    from yourtable 
    group by id 
) t2 
    on t1.id = t2.id 
    and t1.date = t2.date 

SQL Fiddle with Demo

+0

感谢您的回答,可以请你怎么分区的以及OVER解释在这个查询中工作 – Jaguar

+0

@JackDaniels'row_number()over()'将一个分区应用到数据,所以这就是说你想要一个递增的数字,以每个id为基础按照日期递增的顺序增加。如果您有两列可能与您的数据相同,那么您可以将它按两列分区。请参阅此MSDN链接 - http://msdn.microsoft.com/zh-cn/library/ms186734.aspx – Taryn

0
SELECT t.ID, t.Date, t.Value 
FROM (
    SELECT ID, Date, Value, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date DESC) AS RowNumber 
    FROM table_name 
) t 
WHERE t.RowNumber = 1