我正在运行一个PostgreSQL数据库(也使用timescaledb,将在grafana中使用),并且已经学会了如何使用以下内容对一个简单的表进行下采样:
CREATE VIEW my_view
WITH (timescaledb.continuous) --Makes the view continuous
AS
SELECT
time_bucket('1 min', time) as bucket,
avg(sensor1),
avg(sensor2),
avg(sensor3)
FROM
my_table
GROUP BY bucket;
此代码创建一个具有三个传感器的VIEW,然后将采样率从(例如)1秒采样率降低到1分钟采样率。
这一切都很好,直到我有一个要对数百列进行降采样的表为止。我不想写出这段代码,在每个传感器的查询中显式出现数百个平均值。我希望postgresql有一种方法可以将平均聚合一次应用于表的所有列。
我已经花了很多时间在谷歌上寻找答案,这是我能找到的最接近的答案,尽管不是完全相同的问题:
select aggregate function and all other columns
我尝试使用语法avg(*),但是收到语法错误。
CREATE VIEW my_view
WITH (timescaledb.continuous) --Makes the view continuous
AS
SELECT
time_bucket('1 min', time) as bucket,
avg(sensor1),
avg(sensor2),
avg(sensor3)
FROM
my_table
GROUP BY bucket;
另一种尝试是
CREATE VIEW my_view
WITH (timescaledb.continuous) --Makes the view continuous
AS
SELECT
time_bucket('1 min', time) as bucket,
avg(*)
FROM
my_table
GROUP BY bucket;
出现语法错误。
我希望有一种方法可以执行此查询,而不必为每个传感器写出一段跨越数百行的代码。感谢您的帮助。
答案 0 :(得分:0)
您可以使用目录表生成查询,然后在psql中使用\ gexec执行查询,
一个例子是
with avgs as (
select string_agg('avg('||attname||')', ', ') as avg_text
from pg_attribute where attrelid ='my_table'::regclass
)·
select format(
$$·
CREATE VIEW my_view
WITH (timescaledb.continuous) --Makes the view continuous
AS
SELECT
time_bucket('1 min', time) as bucket,
%s
FROM my_table
GROUP BY bucket;
$$,
avg_text)
FROM avgs
\gexec