带配置单元sql的加权移动平均

xesrikrc  于 2021-06-28  发布在  Hive
关注(0)|答案(2)|浏览(352)

给定一个如下的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
...
lh80um4z

lh80um4z1#

这不是幻想,但这是一个开始。

SELECT
    *,
    (SUM (value*0.25) OVER (ORDER BY id ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) +
     SUM (value*0.25) OVER (ORDER BY id ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) +
     SUM (value*0.25) OVER (ORDER BY id ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) +
     value * 0.25) /
    COUNT (value) OVER (ORDER BY id ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM
    table;
wlwcrazw

wlwcrazw2#

如果您希望窗口大小易于更改,那么实现将有很大的不同。
(请注意,我是在SQLServer中开发的,因为我不知道有哪个网站可以测试HiveSQL。您可能需要调整一些语法。)

Declare @thisManyRows int = 3;
With rowNumber_cte As (
    Select 
        id, 
        [Value],
        RowNo = Row_Number() Over (Order By id)
      From Table1),
windows_cte As (
    Select
        b_id = b.id,
        j_id = j.id,
        j.[Value],
        RowNo2 = @thisManyRows + 1 - Row_Number() Over (Partition By b.id Order By j.id desc),
        n = Count(j.[Value]) Over (Partition By b.id)
      From rowNumber_cte As b
      Join rowNumber_cte As j On j.RowNo Between b.RowNo - @thisManyRows + 1 And b.RowNo)
Select
    id = b_id,
    [Value] = Sum(Case When b_id = j_id Then [Value] Else Null End),
    WeightedAverage = Sum([Value] * 1.0 * (RowNo2 *1.0 / @thisManyRows)) / Min(n)
  From windows_cte
  Group By b_id;

我要解释一下这是怎么回事,因为它有点神秘:
将变量设置为移动平均线要考虑的行数(包括当前行)。
rowNumber_cte 我们分配一个行号,我们这样做是因为我们不假设 id 将按顺序进行。
windows_cte 我们加入 rowNumber_cte 在其自身上,以便每一行都与构成其计算窗口的所有行相关联(参考 @thisManyRows 变量。该cte还引入了一种新的 RowNo2 字段,该字段将基本上最终成为该行的值对加权移动平均值有贡献的分数的分子(即,如果窗口为4,则当前行将具有 RowNo2 = 4 重量为4/4)。 windows_cte 还计算窗口中的行数,以便更好地处理数据开头没有完整窗口的行。
最终选择分组依据 id ,乘以 [Value] 按窗口中每行的权重,然后除以窗口中的行数: n .

相关问题