【问题标题】:SQL Server : moving average calculationSQL Server:移动平均计算
【发布时间】:2018-02-13 10:04:09
【问题描述】:

我有一个脚本可以根据过去 3 个月计算移动平均值。

是否可以修改此移动平均线以仅显示第 4 个月的值?或者当我想基于 4 个月计算时,显示第 5 行的值,依此类推...

因此,当我有足够的数据进行计算时,仅显示该月的值。

SELECT 
    [Brand], [month],
    CAST(SUM([Volume]) AS INT) AS [Volume (t)],
    AVG(CAST(SUM([Volume]) AS INT)) OVER (PARTITION BY [Brand]) AS [Average (t)],
    AVG(CAST(SUM([Volume]) AS INT)) OVER (PARTITION BY [Brand] ORDER BY [month] ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS [Moving Average (3)]
FROM 
    dw_lc_full_aggregated_1
WHERE   
    [year] = 2016 AND 
    [month] BETWEEN 1 AND 9 AND
    [Navision Source] = 'HU' AND
    [Brand] = 'xxxxxxx'
GROUP BY 
    [Brand], [month]

【问题讨论】:

  • 你试过使用CASECOUNT吗?
  • 还没有,因为我不知道该怎么做:)
  • 试一试,当COUNT OVER 您的PARTITION 大于3 时,您基本上想要CASE。您也许可以直接将其添加到当前查询中,否则使用您的PARTITION 添加行号,找到它的最大值,然后过滤掉小于 3 的最大行号
  • 您如何决定在移动平均字段中必须包含多少个月?该查询的外观如何?

标签: sql-server moving-average


【解决方案1】:

谢谢!我解决了如下:

SELECT  [Brand],
        [month],
        cast(sum([Volume]) AS INT) as [Volume (t)],
        AVG(cast(sum([Volume])AS INT)) OVER (PARTITION BY [Brand]) AS [Average (t)],

        CASE WHEN (Row_Number() OVER (ORDER BY [month]))>3
        THEN AVG(cast(sum([Volume])AS INT)) 
                    OVER (PARTITION BY [Brand] ORDER BY [month] ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) 
                    ELSE NULL END AS [Moving Average (3)]
............

【讨论】:

    猜你喜欢
    • 2021-03-06
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多