我有一個日誌表,每行代表一個記錄其狀態的對象。每個對象都有一個唯一的,不變的GUID。有多個對象記錄他們的狀態,所以會有成千上萬的條目,對象不斷插入新的日誌。每次對象檢入時,都是通過INSERT。SQL獲取最新獨特行
我有tblObjects中的PrimaryKey,GUID,ObjectState和LogDate列。我想爲tblObjects中的每個唯一GUID選擇最新的(按日期時間)日誌條目,實際上是所有對象的「快照」。
這是如何實現的?
我有一個日誌表,每行代表一個記錄其狀態的對象。每個對象都有一個唯一的,不變的GUID。有多個對象記錄他們的狀態,所以會有成千上萬的條目,對象不斷插入新的日誌。每次對象檢入時,都是通過INSERT。SQL獲取最新獨特行
我有tblObjects中的PrimaryKey,GUID,ObjectState和LogDate列。我想爲tblObjects中的每個唯一GUID選擇最新的(按日期時間)日誌條目,實際上是所有對象的「快照」。
這是如何實現的?
你可以使用子查詢過濾最後的日誌條目:
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
)
注意的是,通常的做法是存儲位標誌指示是否一排是最新的。這可以讓你更快地查詢。
這聽起來像你想爲每個單獨的GUID選擇最新的LogDate。 「按組」使用與最大功能應該做你需要的東西:
Select *, max(LogDate)
From tblObjects
Group By GUID
ObjectState不會出現在GROUP BY中,並且不包含在聚合函數中。也許SQL Server支持這種語言擴展,我只是無知,但看起來像一個錯誤... – 2010-04-24 01:52:13
這似乎是最優雅的解決方案,但我也有這個問題。 – Simpleton 2010-04-24 02:03:26
我假定MySQL正在使用。由於您陳述的原因,這在MS SQL Server中不起作用。 – 2010-04-24 04:50:41
我沒有考慮位標誌的做法,這似乎是一個很好的解決方案搶佔。謝謝! – Simpleton 2010-04-24 01:50:43
添加一個位標記將使查詢更快,但插入更麻煩。對於每個插入,都需要更新來爲特定GUID的前一個「當前」行解除位標記。 – 2010-04-24 01:52:45
是的,國旗的做法似乎很麻煩。物化/索引視圖怎麼樣? – 2010-04-24 04:25:35