滚动平均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;