Как уменьшить количество данных временных рядов со многими столбцами в SQL? - PullRequest
1 голос
/ 06 июня 2019

Я использую базу данных postgresql (также с timescaledb, которая будет использоваться в графане) и узнал, как выполнить даунсамплинг простой таблицы с помощью следующего:

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 есть способ применить усредняющее агрегирование ко всем столбцам таблицы одновременно.

Я довольно долго гуглил для ответа, и это самый близкий, который я смог найти, хотя это не совсем тот же вопрос:

выберите агрегатную функцию и все остальные столбцы

Я пытался использовать синтаксис 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;

, который дал синтаксическую ошибку.

Я надеюсь, что есть способ выполнить этот запрос без необходимости писать фрагмент кода, охватывающий сотни строк для каждого датчика. Спасибо за любую помощь.

1 Ответ

0 голосов
/ 08 июня 2019

Вы можете использовать таблицу каталога для генерации запроса, а затем выполнить его с помощью \ gexec в psql,

Один пример -

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
...