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 帧包含当前行,所以少用了一秒。
我正在使用 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 帧包含当前行,所以少用了一秒。