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

我有以下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查询结果至少有一个是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个结果-只有一个…很抱歉,这是我的错误查询给了我所有三个服务器的一个结果,但我举了一个例子,如果是这种情况,那么我需要至少一个结果。