如何在 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 分钟内所有行总和的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL 中创建具有以下条件的 DB2 存储过程?

如何使用 OpenQuery 在 SQL Server 中创建别名 (IBM DB2)

如何在 DB2 Z/OS 8.1 版本中创建用户定义函数?

DB2 LUW:在Dynamic SQL中创建用户定义的函数

是否可以在 SQL Server 中创建只读同义词?

如何在 DB2/400 中创建生成的列