2010-04-24 40 views
1

我有一個日誌表,每行代表一個記錄其狀態的對象。每個對象都有一個唯一的,不變的GUID。有多個對象記錄他們的狀態,所以會有成千上萬的條目,對象不斷插入新的日誌。每次對象檢入時,都是通過INSERT。SQL獲取最新獨特行

我有tblObjects中的PrimaryKey,GUID,ObjectState和LogDate列。我想爲tblObjects中的每個唯一GUID選擇最新的(按日期時間)日誌條目,實際上是所有對象的「快照」。

這是如何實現的?

回答

3

你可以使用子查詢過濾最後的日誌條目:

select t1.* 
from tblObjects t1 
where t1.LogDate = (
    select max(LogDate) 
    from tblObjects t2 
    where t1.guid = t2.guid 
) 

或者,使用不存在:

select t1.* 
from tblObjects t1 
where not exists (
    select * 
    from tblObjects t2 
    where t1.guid = t2.guid 
    and t1.LogDate < t2.LogDate 
) 

注意的是,通常的做法是存儲位標誌指示是否一排是最新的。這可以讓你更快地查詢。

+0

我沒有考慮位標誌的做法,這似乎是一個很好的解決方案搶佔。謝謝! – Simpleton 2010-04-24 01:50:43

+0

添加一個位標記將使查詢更快,但插入更麻煩。對於每個插入,都需要更新來爲特定GUID的前一個「當前」行解除位標記。 – 2010-04-24 01:52:45

+0

是的,國旗的做法似乎很麻煩。物化/索引視圖怎麼樣? – 2010-04-24 04:25:35

0

這聽起來像你想爲每個單獨的GUID選擇最新的LogDate。 「按組」使用與最大功能應該做你需要的東西:

Select *, max(LogDate) 
From tblObjects 
Group By GUID 
+1

ObjectState不會出現在GROUP BY中,並且不包含在聚合函數中。也許SQL Server支持這種語言擴展,我只是無知,但看起來像一個錯誤... – 2010-04-24 01:52:13

+0

這似乎是最優雅的解決方案,但我也有這個問題。 – Simpleton 2010-04-24 02:03:26

+0

我假定MySQL正在使用。由於您陳述的原因,這在MS SQL Server中不起作用。 – 2010-04-24 04:50:41