选择时间序列数据并将缺失值插入为 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_series
和 left 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;
我有一个 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_series
和 left 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;