SQL获取最新的唯一行

SQL获取最新的唯一行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个日志表,每一行代表一个记录其状态的对象。每个对象都有一个唯一的、不变的GUID。有多个对象记录它们的状态,因此将有数千个条目,对象不断插入新的日志。每次对象检入时,都是通过插入 我在tblObjects中有PrimaryKey、GUID、ObjectState和LogDate列。我想为tblObjects中的每个唯一GUID选择最新的by datetime日志条目,实际上是所有对象的“快照” 如何实现这一点?您可以使用子查询筛选最后的日志条目: select t1.* from tblO

我有一个日志表,每一行代表一个记录其状态的对象。每个对象都有一个唯一的、不变的GUID。有多个对象记录它们的状态,因此将有数千个条目,对象不断插入新的日志。每次对象检入时,都是通过插入

我在tblObjects中有PrimaryKey、GUID、ObjectState和LogDate列。我想为tblObjects中的每个唯一GUID选择最新的by datetime日志条目,实际上是所有对象的“快照”


如何实现这一点?

您可以使用子查询筛选最后的日志条目:

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选择最近的日志日期。使用带有max功能的group by可以完成您需要的操作:

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

我没有考虑BITFLAG方法,这似乎是一个很好的先发制人的解决方案。谢谢添加位标志将使查询更快,但插入更麻烦。对于每一次插入,都需要更新来为特定GUID的上一个当前行取消设置位标志。是的,标志方法看起来很麻烦。那么具体化/索引化视图呢?最终进行子查询,效果非常好。”Preciete it和OMAROBJECTSTATE不显示在GROUP BY中,也不包含在聚合函数中。也许SQL Server支持将其作为一种语言扩展,我对此一无所知,但这似乎是一个错误……这似乎是最优雅的解决方案,但我也遇到了这个问题。我假设使用了MySQL。这在MS SQL Server中不起作用,原因正是您所说的。