【问题标题】:Find Avg of Top 30 Results查找前 30 个结果的平均值
【发布时间】:2015-06-16 13:08:33
【问题描述】:

我有一个查询要输出前 30 个结果

select top 30 * from [dbo].[Stats]
        where Rack_Code = 'ABC'
        order by Date_of_Record desc

并查询以获取所有时间的平均值

SELECT AVG(Total_MB - (East_MB + West_MB)) AS Other,
                    AVG(East_MB) AS East,
                    AVG(West_MB) AS West
                    FROM [dbo].[Stats]
                    WHERE Rack_Code = 'ABC'

给出正确的输出

但是当我尝试获取前 30 个条目的平均值时,SQL 查询似乎忽略了 Top 30

SELECT TOP 30 AVG(Total_MB - (East_MB + West_MB)) AS Other,
                    AVG(East_MB) AS East,
                    AVG(West_MB) AS West
                    FROM [dbo].[Stats]
                    WHERE Rack_Code = 'ABC'

并给出不正确的输出

请指教

【问题讨论】:

  • 没有GROUP BY,你会得到一行作为输出
  • @ughai 是的,我希望有单行作为输出
  • 您在最终查询中没有 order by,所以 top 有点随机。
  • 您是否正在寻找基于 Date_of_Record 的前 30 行的平均值?
  • @ughai 正确,我正在寻找基于Date_of_Record的前 30 行的平均值

标签: sql-server average


【解决方案1】:

您几乎拥有它,您所要做的就是将您的 TOP 30 放在子查询或 CTE 中,而不是您的 AVG

SELECT AVG(Total_MB - ( East_MB + West_MB )) AS Other
   ,AVG(East_MB) AS East
   ,AVG(West_MB) AS West
FROM (
       SELECT TOP 30 *
        FROM [dbo].[stats]
        WHERE Rack_Code = 'ABC'
        ORDER BY Date_of_Record DESC
     ) a

请注意,只有在有TOP 子句时才能在子查询中使用ORDER BY

CTE 解决方案,

;WITH   base
          AS (
               SELECT TOP 30 *
                FROM [dbo].[stats]
                WHERE Rack_Code = 'ABC'
                ORDER BY Date_of_Record DESC
             )
    SELECT AVG(Total_MB - ( East_MB + West_MB )) AS Other
           ,AVG(East_MB) AS East
           ,AVG(West_MB) AS West
        FROM base

Documentataion 在 CTE 上。请注意,SQL-Server 将 CTE 视为视图。这可能会引入一些开销,如果嵌套足够深,则查询优化器将无法读取统计信息并可能导致性能大幅下降。

【讨论】:

  • @vladimir-oselsky CTE?将对此进行研究。
  • @vladimir-oselsky 哦,我记得不久前的视图,它冻结了我的数据库!
  • 本身的浏览量还不错。视图中的错误代码是问题出现的地方。特别是如果不好的观点引用了其他不好的观点。在这种情况下,从视图中选择数据可能会杀死整个服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2021-05-03
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2020-08-10
相关资源
最近更新 更多