Sql 基于子项当前状态的查询

Sql 基于子项当前状态的查询,sql,tsql,Sql,Tsql,正在尝试编写查询以显示公司部门中服务的当前状态。我写的东西不管用。我觉得我走错了方向 SELECT MAX(v_StatusEvents.EventTimeStamp) as EventTimeStamp , MAX(v_StatusEvents.StatusTypeID) as StatusTypeID , v_StatusEvents.ServiceID , v_StatusEvents.StatusTypeDescription , v_StatusEven

正在尝试编写查询以显示公司部门中服务的当前状态。我写的东西不管用。我觉得我走错了方向

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-网络。 每个类别都包含服务。 例如,我有三个属于Interenet类别的服务:50-内部,51-外部,52-开发。 对于当前日期,每个服务将始终至少有一个状态记录。 当前状态将设置为三种不同状态类型值之一: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,因为这是尚未解析的服务的最高当前状态

如果所有服务都没有问题,我希望查询返回值1

谢谢,
crjunk

这就是我发现CTEs公共表表达式有用的地方。它们允许您将问题分解为您可以轻松解决的步骤。让我们在这里应用它

首先,获取每个服务/天的最大状态:

 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,而不是时间戳。还要注意,这不是解决此问题的唯一方法,甚至可能不是最快的方法。事实上,仅使用子查询或联接就可以重新编写此代码。但是,这是任何一种简单的方法,你可以使用它来获得一些有用的东西,并且以后可以很容易地理解。

最终得到了以下解决方案:

选择IsNullMAXtblStatusTypes.StatusTypeImgURL,从tblStatusTypes中选择tblStatusTypes.StatusTypeImgURL,其中tblStatusTypes.StatusTypeID=1 从TBLStatus类型 其中tblStatusTypes.StatusTypeID位于

SELECT MAX(StatusTypeID)
FROM
(   SELECT vse.StatusTypeID, vse.ServiceID, vse.EventTimeStamp
    FROM v_StatusEvents vse,
        (SELECT MAX(EventTimeStamp)AS MaxDate
            ,ServiceID
        FROM   v_StatusEvents 
        WHERE  EventTimeStamp >= Cast(Cast(CURRENT_TIMESTAMP AS DATE) AS DATETIME) 
        AND CategoryID = @CategoryID
        GROUP  BY ServiceID) MaxResults
    WHERE vse.ServiceID = MaxResults.ServiceID
    AND vse.EventTimeStamp = MaxResults.MaxDate
) MaxStatusType )