这是我找到的CTE(公共表表达式)有用。它们允许您将问题分解成可以轻松解决的步骤。让我们在这里应用。
首先,获取最大状态为每个服务/天:
SELECT CatID, SvcID, MAX(StatTypeID) As MaxStatus
FROM v_StatusEvents
WHERE EventTimeStamp >= cast(cast(current_timestamp as Date) as datetime)
GROUP BY CatID, SvcID
现在,我们有这个信息,现在我们还可以发现,最近的一次,这些事件的发生:
WITH StatusInfo As
(
SELECT CatID, SvcID, MAX(StatTypeID) As MaxStatus
FROM v_StatusEvents
WHERE EventTimeStamp >= cast(cast(current_timestamp as Date) as datetime)
GROUP BY CatID, SvcID
)
SELECT se.CatID, se.SvcID, se.StatTypeID, MAX(EventTimeStamp) As EventTimeStamp
FROM v_StatusEvents se
INNER JOIN StatusInfo si ON se.CatID = si.CatID AND se.SvcID = si.SvcID AND se.StatTypeID = si.MaxStatus
WHERE EventTimeStamp >= cast(cast(current_timestamp as Date) as datetime)
如果您有两个具有相同时间戳记的服务,您可以选择使用序列ID在此缩小范围。现在,我们有这个信息,我们可以回到表一次拿起我们可能需要的任何其他领域(在这种情况下,序列ID):再次
WITH StatusInfo As
(
SELECT CatID, SvcID, MAX(StatTypeID) As MaxStatus
FROM v_StatusEvents
WHERE EventTimeStamp >= cast(cast(current_timestamp as Date) as datetime)
GROUP BY CatID, SvcID
), StatusAndTimeInfo As
(
SELECT se.CatID, se.SvcID, se.StatTypeID, MAX(EventTimeStamp) As EventTimeStamp
FROM v_StatusEvents se
INNER JOIN StatusInfo si ON se.CatID = si.CatID AND se.SvcID = si.SvcID AND se.StatTypeID = si.MaxStatus
WHERE EventTimeStamp >= cast(cast(current_timestamp as Date) as datetime)
)
SELECT se.*
FROM v_StatusEvents se
INNER JOIN StatusAndTimeInfo sati ON se.CatID = sati.CatID AND se.SvcID = sati.SvcID AND se.StatTypeID = sati.StatTypeID AND se.EventTimeStamp = sati.EventTimeStamp
WHERE EventTimeStamp >= cast(cast(current_timestamp as Date) as datetime)
请注意,你可能更愿意使用SeID(我认为它是一个序列ID)在最后一次迭代而不是时间戳。还要注意,这不是解决这个问题的唯一方法,或者甚至可能是最快的。事实上,只用子查询或连接就可以重新编写它。但是,这是一种简单的方法,可以用来获取有用的东西,并且可以在以后轻松理解。