1

次のSQLクエリがあります

SELECT TOP 10000 AVG(DailyNodeAvailability.Availability) AS AVERAGE_of_Availability
FROM Nodes 
INNER JOIN DailyNodeAvailability 
    ON (Nodes.NodeID = DailyNodeAvailability.NodeID)
WHERE 
( DateTime > (GetDate()-7) )
 AND  
(
  (
  (Nodes.Caption LIKE '%server1%') OR 
  (Nodes.Caption LIKE '%server2%') OR 
  (Nodes.Caption LIKE '%server3%') 
  )
)

3台のサーバーの平均可用性レポートが表示されます。しかし、私は最小の可用性が必要です。例えば。

Server1 = 100%
Server2 = 97%
Server3 = 88%

SQLクエリの結果を少なくとも1つにして、Server3 = 88%(平均ではない)にしたい

既存のクエリを変更して機能させるにはどうすればよいですか?

混乱があったので、結果の写真を添付し​​ます。それは私に単一の結果を与えますが、平均して、私は平均を望んでいません、私は私の結果に最小の結果値を必要とします、例によると。

ここに画像の説明を入力してください

4

3 に答える 3

2
SELECT MIN(AVERAGE_of_Availability)
FROM
(
SELECT AVG(DailyNodeAvailability.Availability) AS AVERAGE_of_Availability
FROM Nodes 
INNER JOIN DailyNodeAvailability 
    ON (Nodes.NodeID = DailyNodeAvailability.NodeID)
WHERE 
( DateTime > (GetDate()-7) )
 AND  
(
  (
  (Nodes.Caption LIKE '%server1%') OR 
  (Nodes.Caption LIKE '%server2%') OR 
  (Nodes.Caption LIKE '%server3%') 
  )
)
group by Nodes.Caption
) AvgAvailability

これにより最小値が得られますが、表示されているサーバーはわかりません。サーバー名(Nodes.Caption)を取得するには、もう少し行う必要があります。元のクエリには含まれていないため、その部分は含めません。そうしないと、少し複雑になります。

于 2012-04-09T14:36:42.987 に答える
2

基本クエリは次のように記述する必要があります。

SELECT N.Caption AS Server, AVG(A.Availability) AS Avg_Availability
  FROM Nodes AS N
  JOIN DailyNodeAvailability AS A ON (N.NodeID = A.NodeID)
 WHERE DateTime > (GetDate()-7)
   AND (N.Caption LIKE '%server1%' OR
        N.Caption LIKE '%server2%' OR
        N.Caption LIKE '%server3%'
       )
 GROUP BY N.Caption

これにより、各サーバー名と先週のそのサーバーの平均可用性のリストが表示されます。

最小の平均可用性とその平均可用性を持つサーバー名を取得するには、そのクエリをより大きなクエリの一部として扱う必要があります。標準SQLでこれを行うには、2つの方法があります。それは、長くて一般的に利用可能な方法と、簡潔であるがあまり広く利用できない方法です。

長い道のりは、そのクエリをサブクエリとして数回書き出すことになります(したがって、クエリを開発するときは、より複雑なクエリに進む前に、最初のクエリを正しくしてテストすることが重要です)。

SELECT m.server, m.avg_availability
  FROM (SELECT N.Caption AS Server, AVG(A.Availability) AS Avg_Availability
          FROM Nodes AS N
          JOIN DailyNodeAvailability AS A ON (N.NodeID = A.NodeID)
         WHERE DateTime > (GetDate()-7)
           AND (N.Caption LIKE '%server1%' OR
                N.Caption LIKE '%server2%' OR
                N.Caption LIKE '%server3%'
               )
         GROUP BY N.Caption
       ) AS m
  JOIN (SELECT MIN(y.avg_availability) AS min_availability
          FROM (SELECT N.Caption AS Server, AVG(A.Availability) AS Avg_Availability
                  FROM Nodes AS N
                  JOIN DailyNodeAvailability AS A ON (N.NodeID = A.NodeID)
                 WHERE DateTime > (GetDate()-7)
                   AND (N.Caption LIKE '%server1%' OR
                        N.Caption LIKE '%server2%' OR
                        N.Caption LIKE '%server3%'
                       )
                 GROUP BY N.Caption
               ) AS Y
       ) AS x
    ON x.min_availability = m.avg_availability

これを行う簡潔な方法は、共通テーブル式、別名WITH句を使用します。

WITH AvgAvailability AS
    (
    SELECT N.Caption AS Server, AVG(A.Availability) AS Avg_Availability
      FROM Nodes AS N
      JOIN DailyNodeAvailability AS A ON (N.NodeID = A.NodeID)
     WHERE DateTime > (GetDate()-7)
       AND (N.Caption LIKE '%server1%' OR
            N.Caption LIKE '%server2%' OR
            N.Caption LIKE '%server3%'
           )
     GROUP BY N.Caption
    )
SELECT A.Server, A.Avg_Availabilty
  FROM AvgAvailability AS A
  JOIN (SELECT MIN(Avg_Availability) AS Min_Availability
          FROM AvgAvailability
       ) AS M
    ON A.Avg_Availability = M.Min_Availability

(構文はテストされていません。)簡潔なオプションがMSSQLServerで使用できるかどうかはわかりません。

于 2012-04-09T14:54:44.250 に答える
2

これは、次のようにSQLServerでよりコンパクトに実行できます。

SELECT TOP (1) WITH TIES
  N.Caption AS Server,
  AVG(A.Availability) AS Avg_Availability
FROM Nodes AS N
JOIN DailyNodeAvailability AS A
ON (N.NodeID = A.NodeID)
WHERE DateTime > (GetDate()-7)
AND N.Caption LIKE '%server[123]%'
GROUP BY N.Caption
ORDER BY AVG(A.Availability)
于 2012-04-09T20:40:29.133 に答える