滚动平均SQL

滚动平均SQL,sql,average,Sql,Average,嗨,我有一个数据集,其中我有年-月和输出变量,其值如下: Year | Month | Output 2015 | 1 | 12 2015 | 2 | 24 2015 | 3 | 2 2015 | 4 | 3 2015 | 5 | 7 2015 |

嗨,我有一个数据集,其中我有年-月和输出变量,其值如下:

Year    |      Month      |    Output
2015    |       1         |     12
2015    |       2         |     24
2015    |       3         |     2
2015    |       4         |     3
2015    |       5         |     7
2015    |       6         |     3
2015    |       7         |     7
2015    |       8         |     6
2015    |       9         |     7
2015    |      10         |     8
2015    |      11         |     3
2015    |      12         |     6
2016    |      1          |     3
2016    |      2          |     6
2016    |      3          |     8
2016    |      4          |     9
2016    |      5          |     4
。。。。。。。。。等等

我想在数据集中添加一个新列作为滚动平均值 滚动平均值=前12个月产量/本月产量之和

例如: 2015-7年滚动平均值=2015-01年产量+2015-02年产量+2015-03年产量+2015-04年产量+2015-05年产量+2015-06年产量/2015-07年产量

我在网上尝试了几个查询以获得输出,但对我来说不起作用。谁能帮帮我吗

所需输出如下:

Year    |      Month      |    Output  |  Rolling Average
2015    |       1         |     12     |    12
2015    |       2         |     24     |    0.5 
2015    |       3         |     2      |    18
2015    |       4         |     3      |    38/3
2015    |       5         |     7      |    45/7
2015    |       6         |     3      |    48/3
2015    |       7         |     7      |    55/7
2015    |       8         |     6      |    61/6
2015    |       9         |     7      |    68/7
2015    |      10         |     8      |    74/8
2015    |      11         |     3      |    77/3
2015    |      12         |     6      |    83/6
2016    |      1          |     3      |    86/3
2016    |      2          |     6      |    92/6
2016    |      3          |     8      |    100/8
2016    |      4          |     9      |    109/9
2016    |      5          |     4      |    113/4
我尝试的查询是:

SELECT DISTINCT
    //CALCULATIONS
   Year,
   Month,
   Output,
   (sum(CAST(Output) AS DOUBLE)))
   over(order by  year,month   rows  between 12 preceding and 1 preceding )
   as Rolling_Average

   from my_table
   group by  Year,Month
   order by  Year,Month
这给了我一个错误: 语法错误:OVER关键字必须跟在函数调用后面

我也尝试过其他的东西

谁能帮我个忙吗。我使用的是SQL Plx,它类似于SQL


谢谢大家!

如果使用sql server,请尝试此操作

Select * 
from tableName T
outer apply (
             select sum(output) Rolling_Average 
             from tableName T_in on T_in.year = T.year and T_in.Month <= T.Month 
            )x

你可能放错了一些括号

(sum( CAST(Output) AS DOUBLE ))) over (order by year, month rows between 12 preceding and 1 preceding ) as Rolling_Average
与:

SUM( CAST(Output AS DOUBLE) ) OVER (order by year, month rows between 12 preceding and 1 preceding) as Rolling_Average
您还可以对该结果进行四舍五入

而且,这些记录似乎每年每月都是独一无二的。 所以没有必要在这些方面进行分组

选择 t、 年,月,产量, ROUNDSUMCASTt.按t.年,t.月的12行和1行之间的顺序输出为INT*1.0/卡斯特.输出为INT,1为滚动平均值 从我的桌子上 按t年、t月排序; 如果不支持窗口功能,则此操作将正常工作:


DBFIDLE

您的数据库管理系统是什么?您使用的是哪种产品?SQL只是一种查询语言,而不是特定数据库产品的名称。请为使用postgresql、oracle、sql server、db2等的数据库产品添加一个链接…感谢您的快速响应。我正在使用Plx SQLI从未听说过名为Plx SQL的数据库产品。您可以共享该产品网站的链接吗?窗口函数的使用在我看来是正确的,尽管CASTOutput AS DOUBLE应该是CASTOutput AS DOUBLE。它不浇铸也能工作吗?按订单计算的年产量,月产量行介于前12行和前1行之间,滚动平均别名不是有点误导吗?有了这样一个名称,我们更希望得到一个计算结果,比如AVGOutput OVER ORDER BY Year,Month ROWS from 11 previous AND CURRENT ROW作为Rolling_average我使用CASTt1.output作为DOUBLE作为output,但它给了我一个错误。CAST需要使用,因为在这里,我的数据库最初将所有值读取为字符串,所以我使用CAST将它们转换为所需的值datatype@Nik啊,所以它不是数字类型。我现在明白了。但无论如何,该语法应该是CASTt1.output作为DOUBLE。不过,我仍然不确定您使用的是哪种类型的数据库。我不知道任何SQL Plx。例如,如果是MS SQL Server,我建议使用TRY_CAST以避免不包含数字数据的字符串出现错误。@Nik Updated,现在它应该以字符串类型(如VARCHAR)处理输出。
SELECT 
 t1.Year, t1.Month, t1.Output,
 ROUND(SUM(CAST(t2.Output AS INT))*1.0 / CAST(t1.Output AS INT), 1) as Rolling_Average
FROM my_table t1
LEFT JOIN my_table t2 ON ((t2.Year = t1.Year AND t2.Month < t1.Month) OR 
                          (t2.Year = t1.Year - 1 AND t2.Month >= t1.Month))
GROUP BY t1.Year, t1.Month, t1.Output
ORDER BY t1.Year, t1.Month;