Как создать несколько непрерывных агрегатов по одной таблице в TimescaleDB? - PullRequest
0 голосов
/ 20 июня 2019

У меня есть таблица series с ее гипертаблицей. Я хотел бы иметь различные непрерывные агрегаты по данным в этой таблице.

CREATE TABLE series (
    time TIMESTAMPTZ PRIMARY KEY,
    value INTEGER
);

SELECT create_hypertable('series', 'time');

CREATE VIEW mat_view1
WITH (timescaledb.continuous) AS
SELECT time_bucket('1 day', time) AS day,
AVG(value)
FROM series
GROUP BY day;

CREATE VIEW mat_view2
WITH (timescaledb.continuous) AS
SELECT time_bucket('1 week', time) AS week,
COUNT(value)
FROM series
GROUP BY week;

Но, кажется, это невозможно в PostgreSQL 11 - это то, что я получаю, когда запускаю запрос выше:

ERROR:  hypertable already has a continuous aggregate
RECOMMENDATION:  hypertables currently only support a single continuous aggregate. Drop the other continuous aggreagate to add a new one.

Невозможно даже создать другую гипертаблицу для одной и той же таблицы.

ERROR:  hypertable already has a continuous aggregate
RECOMMENDATION:  hypertables currently only support a single continuous aggregate. Drop the other continuous aggreagate to add a new one.

Можно ли обойти это ограничение? Или я должен использовать другой подход (например, дубликат series таблицы для каждого непрерывного агрегата: -x)?

1 Ответ

1 голос
/ 20 июня 2019

В настоящее время это не поддерживается в шкале времени.

Мы планируем выпустить это в шкале времени 1.4, которая должна быть выпущена в ближайшие несколько недель.Для получения подробной информации, проверьте: https://github.com/timescale/timescaledb/pull/1257

Для вашего конкретного варианта использования единственное, что я могу предложить сейчас, - это использовать следующий обходной путь, вы создаете 1 непрерывный агрегат, который содержит все детали, которые вам могут понадобиться, и вы создаетеобычный вид для вашего второго варианта использования:

CREATE VIEW mat_view1
WITH (timescaledb.continuous) AS
SELECT time_bucket('1 day', time) AS day,
AVG(value) AS avg,
COUNT(value) AS count
FROM series
GROUP BY day;

CREATE VIEW view2 AS
SELECT time_bucket('1 week', day) AS week,
SUM(count) AS count
FROM mat_view1
GROUP BY week;
...