微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用多个基于时间的变量计算和更新 timescaleDB 表

如何解决使用多个基于时间的变量计算和更新 timescaleDB 表

我有以下要优化的 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_valuepos1_pricepos2_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

我想对这些数据做如下处理:

  • 计算从最新到上一个条目的每日 sensor_delta (sensor_deltanew)
  • 获取查询日期或时间范围的有效值
  • 根据每天记录的数据计算新数据

我需要的日期:

  • 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 举报,一经查实,本站将立刻删除。