【发布时间】:2021-10-26 11:06:07
【问题描述】:
我有大量关于存储在 TimescaleDB 中的一组电池的时间序列数据,这些数据记录了每个油箱每次的“充电状态”。我没有对流入和流出的测量,只有瞬时充电状态。
从这些数据中,我想找出每次充电状态的变化,稍后我将在几个小时内将其存储到消耗中(在进行一些特定于电池的数学运算之后)。
我编写了一个 SQL 查询来实现我的目标:
SELECT time, charge - LAG(charge) OVER (ORDER BY time) AS delta_soc FROM charge_data;
把它放在Postgres generated column:
ADD COLUMN delta_soc smallint GENERATED ALWAYS AS (charge - LAG(charge) OVER (ORDER BY time)) STORED
按照文档中的承诺失败,因为它引用了另一行。
所以,我(成功)做了一个物化视图:
CREATE MATERIALIZED VIEW delta_soc AS
SELECT
time,
batt_uid,
charge,
(charge-LAG(charge) OVER (ORDER BY time)) as delta_charge,
EXTRACT(EPOCH FROM time-LAG(time) OVER (ORDER BY time)) as delta_time
FROM charge_data
ORDER BY time;
但如果能以近乎实时的方式获得这些数据,那就太好了。毕竟,仅提供上一个值的变化是一个“简单”的操作。所以,我查看了 Timescale 的continuous aggregates。但是,正如在文档中一样,您不允许在连续聚合中使用窗口函数,因此连续聚合无效。
然后,只是往墙上扔东西,看看有什么粘在上面,我想知道我是否可以在插入过程中引用上一行
INSERT INTO charge_data VALUES (..., ([$chargevalue]-LAG(charge) OVER (ORDER BY time)), ...);
HINT: There is a column named "charge" in table "mx_data", but it cannot be referenced from this part of the query.
我知道我可以计算增量
- 插入前
- 插入后通过修改每个 charge_data 行及其增量
- 在 SQL 查询中
- 在查询程序中
但是让数据库在插入时/插入前后计算一次值似乎更简单、更整洁,这让我怀疑我遗漏了一些东西。有没有办法在时间尺度上近实时地为每一行计算和存储charge[battery][n]-charge[battery][n-1]?
【问题讨论】:
-
嘿 Sebastian,我还在工具包中添加了一个问题,以检查 timescale 团队是否可以为其提供内置解决方案:github.com/timescale/timescaledb-toolkit/issues/216