Postgres - Select 时间序列数据中的下一个唯一值

Postgres - Select next unique value in time-series data

在 table 中,我有如下所示的时间序列数据:

t_stamp status_val
2022-04-21 8:00 AM 0
2022-04-21 8:01 AM 0
2022-04-21 8:02 AM 3
2022-04-21 8:03 AM 1
2022-04-21 8:04 AM 1
2022-04-21 8:05 AM 0

上面的例子非常简单。实际上,时间戳是每秒,status_val 在看到不同的值之前可能与 100 行相同。

尝试编写一个查询来选择第一行 & status_val,然后在 status_val 实际更改时选择下一行。所以输出应该是这样的:

t_stamp status_val
2022-04-21 8:00 AM 0
2022-04-21 8:02 AM 3
2022-04-21 8:03 AM 1
2022-04-21 8:05 AM 0

几乎就像在 WHERE 子句中使用 LEAD(status_val,1) <> status_val...但这显然不适用于 WHERE 子句。

我试过使用 group by 和 distinct,但结果不是预期的输出。不是 postgres 专家,所以请保持温和:)

使用 LAG() 确定要从 CTE 中保留哪些行:

with mark_repeats as (
  select t_stamp, status_val,
         coalesce(
           status_val = lag(status_val) over (order by t_stamp),
           false
         ) as is_repeat
    from your_table
)
select t_stamp, status_val
  from mark_repeats
 where not is_repeat;

Working example