SQL平均结果
我有以下SQL查询SQL平均结果,sql,sql-server,select,Sql,Sql Server,Select,我有以下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 ( ( (No
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查询结果至少有一个是Server3=88%,而不是平均值
如何修改现有查询以使其正常工作
有混乱,所以,我附上照片的结果。它给我单一的结果,但在平均值,我不想要平均值,我需要在我的结果最小的结果值,根据例子
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
这将为您提供最小值,但它不会告诉您显示的是哪台服务器。要获取服务器名称节点。我们必须做更多的工作。因为它不在原始查询中,所以我不包括该部分,否则它会使它变得更复杂一点
这将为您提供最小值,但它不会告诉您显示的是哪台服务器。要获取服务器名称节点。我们必须做更多的工作。因为它不在原始查询中,所以我不包括该部分,否则会使它变得更复杂。您的基本查询应写成:
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中有两种方法可以做到这一点:冗长且普遍可用的方法,以及简洁但不太广泛可用的方法
冗长的方法最终会将该查询作为子查询写入几次,因此,在开发查询时,在继续执行更复杂的查询之前,确保第一个查询正确并经过测试至关重要:
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
语法未经测试。我不确定MS SQL Server中是否提供简洁选项。您的基本查询应写成:
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中有两种方法可以做到这一点:冗长且普遍可用的方法,以及简洁但不太广泛可用的方法
冗长的方法最终会将该查询作为子查询写入几次,因此,在开发查询时,在继续执行更复杂的查询之前,确保第一个查询正确并经过测试至关重要:
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
语法未经测试。我不确定MS SQL Server中是否提供简洁选项。您可以在SQL Server中更简洁地执行此操作,如下所示:
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)
在SQL Server中,您可以这样做:
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)
尝试使用最小值而不是平均值?看,你确定你得到了3个结果吗?这不可能是你没有做分组…只是平均值,所以你只能得到1个数字…你当前的查询没有产生你建议它应该产生的数据。它产生了一个没有任何服务器标识的单一平均值。很抱歉,这是我的错误查询提供了所有三个服务器的破坏结果单一结果,但我给出了示例如果是这种情况,那么我至少需要一个结果。试着使用MIN而不是AVG?看,你确定你得到了3个结果吗?这不可能是你没有做分组…只是平均值,所以你只能得到1个数字…你当前的查询没有产生你建议它应该产生的数据。它产生了一个没有任何服务器标识的单一平均值。很抱歉,这是我的错误查询给了我所有三个服务器的破坏结果单一结果,但我举了一个例子,如果是这种情况,那么我需要至少一个结果。如果他没有编写group by,他怎么会有3个结果?他应该只有1个标量值…?我说的是他,不是你。他不能像他说的那样得到3个结果-只有一个…对不起,这是我的错误查询给了我所有三个服务器的一个结果,但我举了一个例子,如果是这样的话,那么我至少需要一个结果。如果他没有写分组,他怎么会有3个结果?他应该只有1个标量值…?我说的是他,不是你。他不能像他说的那样得到3个结果-只有一个…很抱歉,这是我的错误查询给了我所有三个服务器的一个结果,但我举了一个例子,如果是这种情况,那么我需要至少一个结果。