2013-03-14 128 views
1

我有一个具有以下结构的表。用于返回每个ID的最新记录的SQL查询

LocId Value1 Value1Date     
............................................. 
1  50  2012-10-20 14:21:00.000  
1  70  2012-10-21 14:21:00.000  
1  90  2012-10-22 14:21:00.000  
1  100  2012-10-23 14:21:00.000  
2  20  2012-10-20 14:21:00.000  
2  40  2012-10-21 11:21:00.000  
2  70  2012-10-22 14:21:00.000  
2  80  2012-10-23 14:21:00.000 
3  50  2012-10-20 14:21:00.000  
3  70  2012-10-21 11:21:00.000  
3  80  2012-10-22 14:21:00.000  
3  90  2012-10-23 14:21:00.000 

我想达到的目标是,为每个[LOCID],我需要最新的日期时间的[值1](即2012年10月23日)。返回的表格应如下所示:

LocId Value1 Value1Date     
............................................. 
1  100  2012-10-23 14:21:00.000 
2  80  2012-10-23 14:21:00.000 
3  90  2012-10-23 14:21:00.000 

请问谁能举手?由于

回答

4

您可以使用排名在分区像这样:

select * from 
(select locid, value1, value1date, 
    rank() over (partition by locid order by value1date desc) as rank 
    from table1) t 
where t.rank=1 

查看关于让所有的ID和循环通过他们是非常低效的SqlFiddle

+0

谢谢。有用! – alextc 2013-03-14 03:16:06

2

这可以使用Common Table Expression实现和Window Function

WITH records 
AS 
(
    SELECT LocID, VAlue1, Value1Date, 
      ROW_NUMBER() OVER (PARTITION BY LocID ORDER BY Value1Date DESC) rn 
    FROM TableName 
) 
SELECT LocID, VAlue1, Value1Date 
FROM records 
WHERE rn = 1 
1

这种方法会奏效。

select locid, value1, value1date 
from yourtable join 
(select locid id, max(value1date) maxdate 
from yourtable 
group by locid) temp on id = locid 
and value1date = maxdate 
0

这是执行你要找的东西的mysql查询。我不太了解其他SQL。

SELECT * FROM table WHERE LocID = n ORDER BY Value1Date DESC LIMIT 1; 

如果你从一个程序查询,你可以使用:

SELECT LocID FROM table ORDER BY LocID DESC LIMIT 1; 

获得ID的总数(假设他们是连续的),然后把它放在一个循环获取所有最近的日期。

希望有所帮助。

+0

你的建议。我不会经常投票,但是,我只是不喜欢这个答案。 – 2013-03-14 02:25:46

+0

引用自stackoverflow.com.com/privileges/vote-down: 我应该什么时候投票? 当你遇到一个极其潦草,没有付出努力的帖子,或者一个明显或许危险不正确的答案时,使用你的低估。 应对极端情况保留递减投票。这并不意味着它可以代替沟通和编辑。 而不是投下: 如果帖子是垃圾或冒犯性的,请举报。 如果问题重复或脱离主题,请将其标记为主持人注意。 如果有问题,请留下评论或修改帖子以纠正。 – jvance 2013-03-14 02:43:22