【问题标题】:TimescaleDB query to select rows where column value changed from previous rowTimescaleDB 查询以选择列值从前一行更改的行
【发布时间】:2019-10-13 08:02:48
【问题描述】:

最近刚开始使用 TimescaleDB 和 Postgres 来处理大多数数据请求。

但是我遇到了一个问题,我对时间序列数据的请求效率极低。

这是一个可以是任意时间长度的数据系列,具有特定的整数值。

大多数情况下,除非出现异常,否则该值将相同。因此,而不是获取 +10,000 行数据。我想把它聚合成“时间块”。

假设一行中有 97 个项目,其值为 100(每 5 分钟新项目)#98 连续 5 个项目的值为 48,然后再返回 100 的另外 2,900 行。

我不想获取 3002 项来显示此数据。我应该只需要获取 3 个项目。

  • 1 项表示从 startDate 开始的值为 100
  • 1 项表示从 #1 之后的 startDate 值为 48
  • 1 项表示值从 #2 之后的 startDate 再次为 100

但我在弄清楚如何使用 timescaledb 做到这一点时遇到了一些麻烦。

基本上,如果该值与最后一个值相同,则将其聚合。这就是我需要它做的所有事情。

有谁知道如何使用连续聚合(或者如果有更快的方法)在 timescaleDB 中为这种情况构造一个 VIEW 来获取这个?

【问题讨论】:

    标签: postgresql timescaledb


    【解决方案1】:

    您可以使用窗口函数和子选择来实现所需的结果:

    SELECT time, value FROM (
      SELECT 
        time,
        value,
        value - LAG(value) OVER (ORDER BY time) as diff
      FROM hypertable) ht 
    WHERE diff IS NULL OR diff != 0;
    

    您使用窗口函数计算与上一行的差异,然后过滤外部查询中差异为 0 的所有行。

    【讨论】:

    • 不应该是where diff is NOT null or diff != 0吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2012-06-23
    • 2014-07-28
    • 1970-01-01
    • 2020-12-20
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多