如何解决使用多个基于时间的变量计算和更新 timescaleDB 表
SELECT
sensor_reading.day as day,sensor_delta_daily,pos1_daily,(sensor_delta_daily * 1 * calorific_value_daily) AS calcval1_daily
FROM (
WITH sensor_counter AS (
SELECT
time,(LEAD(sensor_delta) OVER (ORDER BY time)/DATE_PART('day',LEAD(time) OVER (ORDER BY time) - time)) as sensor_delta_daily
FROM sensor_counter
WHERE sensor_delta is not null
ORDER BY time
)
SELECT
time_bucket_gapfill('1 day',time) AS day,locf(avg(reading_delta_daily)) AS reading_delta_daily
FROM energy_counter
WHERE time between (Now() - INTERVAL '2 months') and Now()
GROUP BY day
) AS counter_reading,(SELECT
time_bucket_gapfill('1 day',locf(avg(calorific_value)) AS calorific_value_daily
FROM energy_counter_daily_nullable
WHERE time between (Now() - INTERVAL '2 months') AND Now()
AND calorific_value is not null
GROUP BY day
) AS counter_calorific
WHERE counter_reading.day = counter_calorific.day
;
我的问题是:
- 由于我未来需要更多的职位,而且这个 Query 会越来越大,是否可以通过使用连续聚合和物化视图来优化它?
- 如果是:这会是什么样子?
- 如果不是:还有其他更好的选择吗?
更详细理解的解释:
我是数据库的新手,尤其是 timescaleDB,并且有一个具有以下场景的小传感器项目:
我有一个可以返回消耗值的传感器。由于传感器的一些技术限制(大值导致传感器在零点重新启动时溢出),我只存储传感器的当前和上次捕获之间的差异 (sensor_delta)。该值仅在我插入它的那天有效。但是我可以通过将最新值除以之前的消耗值的天数来用有效值填充两个消耗值之间的天数。
还有其他连接到传感器但由我自己捕获和存储的基于时间的数据(pos0_value、pos1_price、pos2_price)。这些值会因不同的事件而在不同时间发生变化,并且从我插入值到插入新值时它们都是有效的。所有这些数据对于我需要的计算都很重要。
所以,这是一大堆废话。为了更好地理解,这是我拥有的简单数据:
实际数据:
时间 | sensor_uuid | sensor_delta | pos0_value | pos1_value | pos2_value |
---|---|---|---|---|---|
2021-06-20 00:00:00 | f5778d7c-46a4-3d6b-8b40-133569cd2f01 | 514.91 | 9.85 | 0.3462 | 19.8263 |
2021-06-23 00:00:00 | f5778d7c-46a4-3d6b-8b40-133569cd2f01 | NULL | NULL | 0.2228 | NULL |
2021-06-27 00:00:00 | f5778d7c-46a4-3d6b-8b40-133569cd2f01 | NULL | NULL | NULL | 18.8928 |
2021-06-30 00:00:00 | f5778d7c-46a4-3d6b-8b40-133569cd2f01 | 560.28 | NULL | NULL | NULL |
我想对这些数据做如下处理:
我需要的日期:
- calcval1_daily = sensor_delta_daily*pos1_daily+pos0_daily
- calcval2_daily = sensor_delta_daily+pos2_daily+calcval1_daily
天 | sensor_delta_daily | pos0_daily | pos1_daily | pos2_daily | calcval1_daily | calcval2_daily |
---|---|---|---|---|---|---|
2021-06-20 | 514.91 | 9.85 | 0.3462 | 19.8263 | 188,111842 | 722,848142 |
2021-06-21 | 56.028 | 9.85 | 0.3462 | 19.8263 | 29,2468936 | 105.1011936 |
2021-06-22 | 56.028 | 9.85 | 0.3462 | 19.8263 | 29,2468936 | 105.1011936 |
2021-06-23 | 56.028 | 9.85 | 0.2228 | 19.8263 | 22,3330384 | 98,1873384 |
2021-06-24 | 56.028 | 9.85 | 0.2228 | 19.8263 | 22,1873384 | |
2021-06-25 | 56.028 | 9.85 | 0.2228 | 19.8263 | 22,1873384 | |
2021-06-26 | 56.028 | 9.85 | 0.2228 | 19.8263 | 22,1873384 | |
2021-06-27 | 56.028 | 9.85 | 0.2228 | 18.8928 | 22,3330384 | 97,2538384 |
2021-06-28 | 56.028 | 9.85 | 0.2228 | 18.8928 | 22,2538384 | |
2021-06-29 | 56.028 | 9.85 | 0.2228 | 18.8928 | 22,2538384 | |
2021-06-30 | 56.028 | 9.85 | 0.2228 | 18.8928 | 22,2538384 | |
2021-07-01 | NULL | 9.85 | 0.2228 | 18.8928 | NULL | NULL |
2021-07-02 | NULL | 9.85 | 0.2228 | 18.8928 | NULL | NULL |
2021-07-03 | NULL | 9.85 | 0.2228 | 18.8928 | NULL | NULL |
插入下一个 sensor_delta 后,sensor_delta_daily 应更新到 2021-07-01。
我知道,这已经很多了。我也掌握了这个场景,到目前为止我想出的唯一解决方案是上面提到的查询,它返回了我想要的数据集(我省略了 pos2_value 和 calcval2_daily)。但是我拥有的数据位置越多,Query 就会堆积得越多,我觉得 Query 变得非常大、不可读且缓慢。
您对如何解决这种情况有什么想法吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。