【问题标题】:SQL Server 2008 Rolling AverageSQL Server 2008 滚动平均值
【发布时间】:2015-11-22 09:00:34
【问题描述】:

我正在尝试创建一个 SQL 语句来计算我的数据的 6 个月滚动平均值。我正在关注本指南:

SQL Query for 7 Day Rolling Average in SQL Server

但问题是我使用的是 SQL Server 2008,这里的答案是 2012 年。

select 
    x.*,
    avg(dailyusage) over(partition by productid order by productid, date rows between 6 preceding and current row) as rolling_avg
from 
    (select 
         productid, date, sum(usagecount) as dailyusage
     from tbl
     group by productid, date) x

如果有人能帮我把它翻译成 2008 年的术语,我们将不胜感激。

谢谢

【问题讨论】:

  • 你的意思是改成2008?不工作?给你一个错误? SQL Fiddle 将其更改为左上角组合中的 2008 即可。
  • @JuanCarlosOropeza SQL Server 2008 中没有用于聚合函数的 ORDER BY
  • @Lamak 抱歉,我在 sqlFiddle 上没有看到任何错误。
  • @JuanCarlosOropeza 那是sqlfiddle的问题,但不代表真的可以用
  • @JuanCarlosOropeza SQL Fiddle 实际上是使用虚拟机管理程序在 2014 服务器上运行的,而 2008 选项只是意味着兼容性级别将设置为 100 并且出于某种原因 SQL Server 使用 order by,即使它不应该兼容。 lvl 设置为 100。

标签: sql sql-server-2008


【解决方案1】:

您可以尝试使用OUTER APPLY,但效率不高:

;WITH CTE AS
(
    SELECT  *,
            ROW_NUMBER() OVER(PARTITION BY productid ORDER BY [date]) RN
    FROM (  SELECT productid, [date], SUM(usagecount) dailyusage
            FROM dbo.YourTable
            GROUP BY productid, [date]
         ) t
)
SELECT TOP 100 *
FROM CTE A
OUTER APPLY(SELECT AVG(dailyusage) rolling_avg
            FROM CTE
            WHERE productid = A.productid
            AND A.RN - RN BETWEEN 0 AND 6) B;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多