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;
在 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;