给定一个如下的Hive表,我想计算一个加权移动平均数。表1是这种加权移动平均数的一个例子。每列的值都是
col_value = (1 * n) + (0.75 * n-1) + (0.5 * n-2) + (0.25 * n-3)
where n is the value at the current row, n-1 the value at the above row, etc.
有关加权移动平均数的更多信息,请参见相应的wikipedia部分
我在计算移动平均线后陷入了困境,就像这样:
代码示例1:到目前为止的查询
SELECT
*,
AVG (value) OVER (
ORDER BY
id
ROWS BETWEEN
3 PRECEDING AND CURRENT ROW
FROM
table
表1:
id value weighted_moving_average code_sample_1
...
11 0 0 0
12 1 1 0.25
13 0 0.75 0.25
14 0 0.5 0.25
15 0 0.25 0.25
16 0 0 0
...
2条答案
按热度按时间lh80um4z1#
这不是幻想,但这是一个开始。
wlwcrazw2#
如果您希望窗口大小易于更改,那么实现将有很大的不同。
(请注意,我是在SQLServer中开发的,因为我不知道有哪个网站可以测试HiveSQL。您可能需要调整一些语法。)
我要解释一下这是怎么回事,因为它有点神秘:
将变量设置为移动平均线要考虑的行数(包括当前行)。
在
rowNumber_cte
我们分配一个行号,我们这样做是因为我们不假设id
将按顺序进行。在
windows_cte
我们加入rowNumber_cte
在其自身上,以便每一行都与构成其计算窗口的所有行相关联(参考@thisManyRows
变量。该cte还引入了一种新的RowNo2
字段,该字段将基本上最终成为该行的值对加权移动平均值有贡献的分数的分子(即,如果窗口为4,则当前行将具有RowNo2 = 4
重量为4/4)。windows_cte
还计算窗口中的行数,以便更好地处理数据开头没有完整窗口的行。最终选择分组依据
id
,乘以[Value]
按窗口中每行的权重,然后除以窗口中的行数:n
.