尝试编写查询以显示公司部门中服务的当前状态。我写的只是不工作。我觉得我走向了错误的方向。
SELECT MAX(v_StatusEvents.EventTimeStamp) as EventTimeStamp
, MAX(v_StatusEvents.StatusTypeID) as StatusTypeID
, v_StatusEvents.ServiceID
, v_StatusEvents.StatusTypeDescription
, v_StatusEvents.ServiceName
, v_StatusEvents.CategoryName
FROM v_StatusEvents
WHERE v_StatusEvents.CategoryID = 100
AND YEAR(v_StatusEvents.EventTimeStamp) = YEAR(getdate())
AND MONTH(v_StatusEvents.EventTimeStamp) = MONTH(getdate())
AND DAY(v_StatusEvents.EventTimeStamp) = DAY(getdate())
GROUP BY v_StatusEvents.ServiceID
, v_StatusEvents.StatusTypeDescription
, v_StatusEvents.ServiceName
, v_StatusEvents.CategoryName
我有三个类别:(100 - 互联网,101 - 应用程序,102 - 网络)
每个CATEGORY都包含服务
例如,我有三个属于CATEGORY Interenet的服务:(50 - 内部,51 - 外部,52 - 开发)。
每个SERVICE将始终至少有一个当前日期的状态记录
CURRENT STATUS将设置为三种不同的STATUS TYPES值之一:1 =无问题,2 =中断,3 =严重。
我想为今天的每个类别显示最高的状态类型。
以下是今天日期的样本记录集。
SeID CatID EventTimeStamp SvcID StatTypeID
201 100 11/11/2012 12:01am 52 1
202 100 11/11/2012 12:01am 51 1
203 100 11/11/2012 12:01am 50 1
204 100 11/11/2012 08:00am 51 3
205 100 11/11/2012 10:50am 50 2
206 100 11/11/2012 11:00am 50 1
207 100 11/11/2012 11:25am 52 2
正如您所看到的,内部网站在10:50米处出现了中断问题,但在上午11:00解决了。
外部网站存在一个尚未解决的关键问题。我希望查询返回值3,因为这是尚未解析的SERVICE的最高CURRENT状态。
(如果所有服务都“没有问题”,我希望查询返回值1)
谢谢,
crjunk
答案 0 :(得分:0)
这是我发现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)。另请注意,这不是解决此问题的唯一方法,甚至可能是最快的问题。实际上,只使用子查询或连接就可以重写它。但这是一种简单的方法,可以用来获得有用的东西,以后可以很容易理解。