【问题标题】:Window function to calculate average in SQL Server 2008 R2在 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 ... 选项

标签: sql sql-server sql-server-2008-r2 average partitioning


【解决方案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,发布您的所有表格和示例数据,在您的问题中您甚至没有提及单个表格名称,并且您希望我们在问题中缺少信息时回答?我为您提供了回答上述问题的示例查询,使用它并更新它以使其与您的原始查询一起使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2014-12-09
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多