选择时间序列数据并将缺失值插入为 null

Selecting time-series data and interpolating missing values as null

我有一个 table 的 (tstz, value) 数据是在随机时间点插入的,通常是每秒插入一次。我想 select 并平均时间序列数据,我可以这样做:

SELECT 
    to_timestamp(round((extract(epoch from tstz)) / 10) * 10) AS ts, 
    AVG(value) 
FROM table
GROUP BY ts
ORDER BY ts

函数 to_timestamp(round((extract(epoch from tstz)) / 10) * 10) 将 timestamptz 舍入到最接近的提供间隔(即本例中的 10 秒)。因此,假设每秒有 10 个值,则 10 个值聚合成一个平均值。虽然,如果有 10 秒的周期(或等于我们平均周期的任何周期),那么时间戳将“丢失”,我希望该值改为空值。

我正在尝试使用 generate_series(),以便我有一个准确的时间戳列表,我可以成功完成。但是,我不知道如何使它与上面的查询兼容,并在没有要平均的值的地方添加空值。

使用 generate_seriesleft outer join 将其与您的查询一起构建 ts 个连续的列表。为了清楚起见,我使用 CTE,但子查询也可以。

with t as --your query 
(
 SELECT 
    to_timestamp(round((extract(epoch from tstz)) / 10) * 10) AS ts, 
    AVG(value) 
 FROM table
 GROUP BY ts
),
contiguous_ts_list as
(
 select ts from generate_series(
  (select min(ts) from t),
  (select max(ts) from t), 
  interval '10 seconds'
 ) ts
)
select * 
from contiguous_ts_list 
left outer join t using (ts)
order by ts;