在 SQL Server 2008 R2 中计算平均值的窗口函数

Posted

技术标签:

【中文标题】在 SQL Server 2008 R2 中计算平均值的窗口函数【英文标题】:Window function to calculate average in SQL Server 2008 R2 【发布时间】:2013-02-01 22:27:09 【问题描述】:

我对窗口函数没有太多经验,我必须使用一个来进行平均计算, 这是我的代码:

    AVG(b.TotalSilkHrs) OVER(partition BY b.TECHNICIANCODE
    ORDER BY b.rankID 
    ROWS BETWEEN CURRENT ROW and 3 FOLLOWING) AS MovingAvg

我计算在子查询中计算的总和的平均值。 它给了我错误:

消息 102,级别 15,状态 1,第 24 行 “ROWS”附近的语法不正确。

为什么我会出错?我使用了从您的网站获得的代码

【问题讨论】:

我认为 SQL Server 不支持这种类型的分区定义。如果有的话,您将需要 SQL Server 2012,在此之前,Window 函数的实现非常有限。 您使用的是哪个版本的SQL Server SQL Server 2012 支持 OVER() 子句。 2008 R2。我还能如何计算受子查询周期限制的平均值? @MikaelEriksson:在 SQL Server 2005 中引入了窗口函数,但不支持通过在窗口定义中包含 order by 来运行聚合。这是在 SQL Server 2012 中引入的,但我仍然不确定 2012 年是否支持 rows between ... 选项 【参考方案1】:

您的原始语法仅适用于 SQL Server 2012,对于旧版本试试这个

;WITH AVGCTE AS
(
     SELECT *, 
     ROW_NUMBER() OVER(partition BY TECHNICIANCODE ORDER BY rankID) Rn 
     FROM TableA
)

SELECT A.*, B.AVG_COL
FROM AVGCTE A
CROSS APPLY 
(
   SELECT x.AVG(TotalSilkHrs) AVG_COL 
   FROM AVGCTE x WHERE x.Rn BETWEEN A.rn and a.rn + 2  
   AND  A.TECHNICIANCODE  = x.TECHNICIANCODE        
) B

【讨论】:

第一个语句不起作用,因为我必须限制期间第二个代码也不起作用,因为我的总和仅从 5 个不同的表中计算出来,并且当我在这个子选择中排列它们时声明,它对任何一个都不起作用。 @user2019324,发布您的所有表格和示例数据,在您的问题中您甚至没有提及单个表格名称,并且您希望我们在问题中缺少信息时回答?我为您提供了回答上述问题的示例查询,使用它并更新它以使其与您的原始查询一起使用

以上是关于在 SQL Server 2008 R2 中计算平均值的窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 2008 R2 中计算平均值的窗口函数

安装sql server 2008 R2,提示错误:此计算机上安装了 Microsoft Visual Studio 2008 的早期版本。请在安装 SQL Server 2008 前将 Micros

SQL Server 2008 R2:计数字符匹配

安装了SQL2005再安装SQL 2008R2,提示此计算机上安装了 Microsoft Visual Studio 2008 的早期版本和检查是否安装了 SQL Server 2005 Expres

Java / SQL Server 2008 R2 Express 连接问题

迁移MSSql Db - 来自SQL Server 2008 R2 Enterprise备份可以在SQL Server 2008 R2 Express版本中还原