0

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

所以,有一个值和时间戳的表

 |-----------|------------------|
 |   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    |

每小时可以有可变数量的值,所以我不能在多行上做一个窗口,因为我不知道它暗示了多少行。

有什么建议么?

4

1 回答 1

1

这有点棘手。尽管 Hive 支持range窗口框架,但它只支持数字,而不支持间隔。

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

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

3559 = 60 * 60 - 1,比一小时少一秒。因为窗口框架包括当前行,所以使用的时间少了一秒。

于 2021-02-03T13:56:12.817 回答