2012-11-14 28 views
0

试图编写查询以显示公司部门中服务的当前状态。我写的只是不起作用。我感觉我正走向错误的方向。我有三个类别:(100-互联网,101-应用程序和102-网络)。我有三个类别:(100-互联网,101-应用程序和102-网络)。
每个CATEGORY包含SERVICES。例如,我有三个属于CATEGORY Interenet的服务:(50-内部,51-外部,52-开发)。
每个SERVICE将始终至少有一个当前日期的状态记录。
当前状态将被设置为三种不同的状态类型值之一: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:50M,但它是在上午11:00解决。

外部网站还存在一个尚未解决的关键问题。我希望查询返回值3,因为这是尚未解决的SERVICE的最高当前状态。

(如果所有的服务“没有问题”,我希望查询返回值1)

感谢,
crjunk

回答

0

结束了与下述溶液来:

SELECT(ISNULL(MAX(tblStatusTypes.StatusTypeImgURL),(SELECT tblStatusTypes.StatusTypeImgURL FROM tblStatusTypes WHERE tblStatusTypes。StatusTypeID = 1))) FROM tblStatusTypes WHERE 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) 
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)在最后一次迭代而不是时间戳。还要注意,这不是解决这个问题的唯一方法,或者甚至可能是最快的。事实上,只用子查询或连接就可以重新编写它。但是,这是一种简单的方法,可以用来获取有用的东西,并且可以在以后轻松理解。