【发布时间】:2021-06-17 20:19:45
【问题描述】:
我正在尝试对在任何给定行的时间戳之前 5 分钟内具有时间戳的行求和。我面临的问题是,前 5 分钟内没有预定义的行数,从初始时间戳开始计算 5 分钟间隔不会给出预期的结果。
下表显示了所需的输出:
| TimeStamp | Sales | SUM_PREVIOUS_5_MINS_SALES |
|---|---|---|
| 18:04:03 | 2 | 2 |
| 18:05:23 | 5 | 7 |
| 18:05:58 | 3 | 10 |
| 18:09:34 | 4 | 12 |
【问题讨论】:
我正在尝试对在任何给定行的时间戳之前 5 分钟内具有时间戳的行求和。我面临的问题是,前 5 分钟内没有预定义的行数,从初始时间戳开始计算 5 分钟间隔不会给出预期的结果。
下表显示了所需的输出:
| TimeStamp | Sales | SUM_PREVIOUS_5_MINS_SALES |
|---|---|---|
| 18:04:03 | 2 | 2 |
| 18:05:23 | 5 | 7 |
| 18:05:58 | 3 | 10 |
| 18:09:34 | 4 | 12 |
【问题讨论】:
一种方法使用窗口函数:
select t.*,
sum(sales) over (order by extract(epoch from timestamp)
range between 299 preceding and current row
) as sales_prev_5_minutes
from t;
注意:299 = 5 * 60 - 1,即 5 分钟内的秒数(嗯,减一,因为包括当前行)。
【讨论】:
RANGE | ROWS 的组边界表达式。请参阅OLAP specification 的group-bound1 描述。因此,您应该将 (5 * 60) -1 更改为 299 以使其在 Db2 中工作。