SQL 特定时间的移动平均线

SQL Moving Average over specific time

我正在使用 Impala 和 Hive,所以我不知道我是否有 Oracle 或 MSQL 提供的奇特功能

所以,有 table 个值和时间戳

 |-----------|------------------|
 |   value   |     timestamp    |
 |-----------|------------------|
 |     2     |    12:02:34      | 
 |-----------|------------------|
 |     5     |    12:06:30      |
 |-----------|------------------|
 |     2     |    13:01:33      |
 |-----------|------------------|
 |     2     |    13:04:00      |

我只想获得一个额外的列,其中包含最后一个小时的滚动平均值

 |-----------|------------------|--------|
 |   value   |     timestamp    |  avg   |
 |-----------|------------------|--------|
 |     2     |    12:02:34      |   2    |
 |-----------|------------------|--------|
 |     5     |    12:06:30      |  3.5   |
 |-----------|------------------|--------|
 |     2     |    13:01:33      |   3    |
 |-----------|------------------|--------|
 |     2     |    13:04:00      |   3    |

每个小时的值数量可变,所以我无法对多行执行 Window,因为我不知道它意味着多少行。

有什么建议吗?

这有点棘手。虽然 Hive 支持 range window 帧,但它只支持带数字的帧,不支持间隔。

因此,您需要将时间戳转换为数字,然后使用它:

select t.*,
       avg(value) over (order by unix_timestamp(timestamp)
                        range between 3559 preceding and current row
                       )
from t;

3559 = 60 * 60 - 1,比一小时少一秒。因为 window 帧包含当前行,所以少用了一秒。