0

会社の部門のサービスの現在のステータスを表示するクエリを作成しようとしています。私が書いたものは機能していません。間違った方向に進んでいるような気がします。

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

3 つのカテゴリがあります: (100 - インターネット、101 - アプリケーション、および 102 - ネットワーク)。
各カテゴリにはサービスが含まれています。
例として、CATEGORY Internetet に属する 3 つのサービスがあります: (50 - 内部、51 - 外部、52 - 開発)。
各サービスには常に、現在の日付のステータス レコードが少なくとも 1 つあります。
CURRENT STATUS は、3 つの異なる STATUS TYPES 値のいずれかに設定されます: 1 = 問題なし、2 = 中断、3 = 重大。

今日の各カテゴリの最高の STATUS TYPE を表示したいと思います。

以下は、今日の日付に設定されたサンプル レコードです。

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 に内部 Web サイトで中断の問題が発生しましたが、午前 11:00 に解決されました。

外部 Web サイトには、まだ解決されていない重大な問題が進行中です。クエリが値 3 を返すようにしたいのは、これが解決されていないサービスの最高の現在のステータスであるためです。

(すべてのサービスに「問題がない」場合、クエリは値 1 を返すと予想されます)

ありがとう、
クジャンク

4

2 に答える 2

0

次の解決策で終わった:

SELECT (IsNull(MAX(tblStatusTypes.StatusTypeImgURL), (SELECT tblStatusTypes.StatusTypeImgURL FROM tblStatusTypes WHERE tblStatusTypes.StatusTypeID = 1))) FROM tblStatusTypes WHERE tblStatusTypes.StatusTypeID in (

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 )
于 2012-11-19T18:27:41.920 に答える
0

ここで、CTE (Common Table Expressions) が役立つと思います。これにより、問題を簡単に解決できるステップに分解できます。ここに適用してみましょう。

まず、各サービス/日の最大ステータスを取得します。

 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)

サービスに対して同じタイムスタンプを持つ 2 つのイベントが発生する可能性がある場合は、代わりにシーケンス 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 であると推測されます) を使用することをお勧めします。これがこの問題を解決する唯一の方法ではなく、おそらく最も速い方法ではないことにも注意してください。実際、サブクエリまたは結合のみを使用してこれを書き直すことは可能です。しかし、これは機能するものを取得するために使用できる簡単な方法であり、後で簡単に理解できます。

于 2012-11-14T21:51:25.317 に答える