【问题标题】:Is there a way of computing numerical integration on PostgreSQL?有没有办法在 PostgreSQL 上计算数值积分?
【发布时间】:2021-09-10 02:48:27
【问题描述】:

我有一个包含以下列的表格:timestampnameactivePower。我想据此计算功耗并将其添加到 Grafana 折线图中。

现在,我正在做的是累积和,如下所示:

SELECT
  "timestamp" as time,
  "name", sum("activePower")
    OVER(
      PARTITION BY "name"
      ORDER BY "timestamp"
    ) AS cumulative_sum
FROM   main

不幸的是,timestamp 的间隔不规则,我想做一些类似数值积分的事情(使用梯形规则或其他东西)。

【问题讨论】:

  • 您可以连接相邻的行,然后将时间戳的差异乘以有功功率。精确计算取决于记录的语义。梯形应该类似于将两个有功功率的平均值乘以时间戳间隔的长度。所以一般来说:这是可能的,使用JOIN 并在间隔上操作
  • 您可以使用* 运算符进行乘法运算。您可以使用SUM() 聚合函数求和。你可能还需要lag() 窗口函数!
  • 我认为这是完全可能的。请在您的问题中添加几行示例数据,以及预期的结果。

标签: sql postgresql numerical-methods numerical-integration


【解决方案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)
    

    也应该按时间戳排序。

    【讨论】:

    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多