有没有办法在 PostgreSQL 上计算数值积分?
Posted
技术标签:
【中文标题】有没有办法在 PostgreSQL 上计算数值积分?【英文标题】:Is there a way of computing numerical integration on PostgreSQL? 【发布时间】:2021-09-10 02:48:27 【问题描述】:我有一个包含以下列的表格:timestamp
、name
和 activePower
。我想据此计算功耗并将其添加到 Grafana 折线图中。
现在,我正在做的是累积和,如下所示:
SELECT
"timestamp" as time,
"name", sum("activePower")
OVER(
PARTITION BY "name"
ORDER BY "timestamp"
) AS cumulative_sum
FROM main
不幸的是,timestamp
的间隔不规则,我想做一些类似数值积分的事情(使用梯形规则或其他东西)。
【问题讨论】:
您可以连接相邻的行,然后将时间戳的差异乘以有功功率。精确计算取决于记录的语义。梯形应该类似于将两个有功功率的平均值乘以时间戳间隔的长度。所以一般来说:这是可能的,使用JOIN
并在间隔上操作
您可以使用*
运算符进行乘法运算。您可以使用SUM()
聚合函数求和。你可能还需要lag()
窗口函数!
我认为这是完全可能的。请在您的问题中添加几行示例数据,以及预期的结果。
【参考方案1】:
您可以使用lag()
和总和。像这样的:
select m.*,
sum( (extract(epoch from timestamp) - extract(epoch from prev_timestamp)) * (activePower + prev_activePower) / 2 ) as activePower_seconds
from (select m.*,
lag(timestamp) over (partition by name order by timestamp) as prev_timestamp,
lag(activePower) over (partition by name order by activePower) as prev_activePower
from main m
) m;
这使用秒作为水平轴的积分。
【讨论】:
【参考方案2】:虽然被标记为正确,第二行:
lag(activePower) over (partition by name order by activePower)
也应该按时间戳排序。
【讨论】:
这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review以上是关于有没有办法在 PostgreSQL 上计算数值积分?的主要内容,如果未能解决你的问题,请参考以下文章