我这个叫从第三方应用程序StateChanges(190万行)大表包含此数据:的SQL Server:获取最后一个记录一组给定的组件的某个特定日期之前发生
[ComponentID] : integer : Id of what changed
[NewStatus] : integer : How it changed (0: OK, 1: Error, 2:Warning)
[ConsoleTimeStamp] : timestamp, index : When it changed.
我需要在两个日期之间显示一堆组件状态的各种更改。这是相当微不足道的。然而,我显示我的数据是这样的:
[OldStatus] --> [New Status] | [ConsoleTimeStamp]
我的问题是,为了获得给定的组件的“初始”状态,我需要让行立即初始日期前所有组件。没有任何我们可以确定的范围,在2003年和现在之间可能没有变化。
单个组件,我能得到这个查询足够快的工作:
SELECT TOP 1 [NewStatus], [ConsoleTimeStamp] FROM [StateChanges]
WHERE [ComponentID] = ? AND [ConsoleTimeStamp] < ?
ORDER BY [ConsoleTimeStamp] DESC
现在,有没有办法让所有的“以前的状态”为我所有的组件(ID被在一个数组中)以有效的方式?我已经试过:
SELECT ComponentId, NewStatus, MAX(ConsoleTimeStamp) As LastDate FROM StateChanges
WHERE ComponentId IN ({0}) AND ConsoleTimeStamp <= ?
GROUP BY ComponentId,NewStatus
ORDER BY ComponentId ASC, LastDate ASC
这个解决方案恰好是真正的慢(和给予额外的结果我并不需要)相比,取整组两个日期之间变化的其他查询。
谢谢。
得爱你的gravatar :-) – 2011-05-20 18:16:23