如何在 DB2 SQL 中创建一个给出给定行时间戳之前 5 分钟内所有行总和的列?
Posted
技术标签:
【中文标题】如何在 DB2 SQL 中创建一个给出给定行时间戳之前 5 分钟内所有行总和的列?【英文标题】:How do I create a column that gives the sum of all rows within 5 minutes previous of a given rows timestamp in DB2 SQL? 【发布时间】: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 |
【问题讨论】:
【参考方案1】:一种方法使用窗口函数:
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 分钟内的秒数(嗯,减一,因为包括当前行)。
【讨论】:
Db2 不支持RANGE | ROWS
的组边界表达式。请参阅OLAP specification 的group-bound1
描述。因此,您应该将 (5 * 60) -1
更改为 299
以使其在 Db2 中工作。
@MarkBarinstein 。 . .谢谢你。你知道为什么它不接受 constants 的表达式吗?这应该在编译阶段进行评估。
我不知道。大概就是这样的实现吧。以上是关于如何在 DB2 SQL 中创建一个给出给定行时间戳之前 5 分钟内所有行总和的列?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 OpenQuery 在 SQL Server 中创建别名 (IBM DB2)