在 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
安装了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版本中还原