TimescaleDB查询以选择列值与上一行不同的行

时间:2019-05-27 19:01:31

标签: postgresql timescaledb

最近刚开始将TimescaleDB与postgrest一起使用来处理大多数数据请求。

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

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

在大多数情况下,除非出现异常,否则值将保持不变。因此,而不是获取+10,000行数据。我想将其汇总为“时间块”。

假设某行中有97个项目,其值为100(每5分钟有一个新项目)#98连续5个项目的值为48,然后又返回了2,900行中的100。 / p>

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

  • 1个从startDate值等于100的项目
  • 1个项,其值在#1之后的startDate中为48
  • 从#2之后的startDate再次返回值为100的1个项目

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

基本上,如果该值与最后一个值相同,则将其汇总。这就是我要做的全部。

有人知道如何使用连续聚合(或者是否有更快的方法)在timescaleDB中针对这种情况构造VIEW?

1 个答案:

答案 0 :(得分:2)

您可以通过窗口功能和子选择来获得所需的结果:

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的所有行。