2013-03-14 99 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