基本クエリは次のように記述する必要があります。
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で使用できるかどうかはわかりません。