#clickhouse
Вопрос:
Я создаю программу просмотра ключевых показателей эффективности, в которой я должен показывать определенные агрегированные значения в течение 5-6 лет. Поскольку я довольно новичок в CH, я в значительной степени полагаюсь на чтение документации, но иногда мне не хватает примеров.
CREATE TABLE test1.table1
(
seriesId Int32,
amount Int64,
txt varchar(100)
) ENGINE = MergeTree()
order by (seriesId)
;
Теперь цель состоит в том, чтобы получить материализованное представление, которое делает
- сумма всех сумм в серии
- подсчет (отдельный) всех сумм в серии
- мин (сумма)
- максимальное (количество)
я выяснил, как использовать SummingMergeTree для решения части СУММЫ и подсчета (если я создам отдельное представление только для этих 2 агрегированных значений), но я не могу определить минимальное и максимальное значение. Каждое решение, которое я получаю, имеет дубликаты в представлении. Для SummingMergeTree также могут быть дубликаты, но в конечном итоге они будут объединены, но для aggregatingMergeTree я, похоже, не смогу их объединить.
В необработанной таблице есть примерно. 4 Миллиарда строк
моя попытка состояла в том, чтобы сделать это именно так
CREATE MATERIALIZED VIEW test1.MV1
ENGINE=AggregatingMergeTree()
ORDER BY seriesId
POPULATE
AS
SELECT
seriesId ,
sum(amount) as amt ,
min(amount) as minAmt,
max(amount) as maxAmt
from test1.table1 t
group by seriesId
Теперь это работает не так, как я надеялся.
Ответ №1:
Попробуйте вот это:
CREATE MATERIALIZED VIEW test1.MV1
(
seriesId Int32,
sumAmt SimpleAggregateFunction(sum, Int64),
minAmt SimpleAggregateFunction(min, Int64),
maxAmt SimpleAggregateFunction(max, Int64),
uniqAmt AggregateFunction(uniqExact, Int64)
)
ENGINE=AggregatingMergeTree()
ORDER BY seriesId
AS
SELECT
seriesId ,
sum(amount) sumAmt,
min(amount) minAmt,
max(amount) maxAmt,
uniqExactState(amount) uniqAmt
from test1.table1 t
group by seriesId
select seriesId, sum(sumAmt), min(minAmt), max(maxAmt), uniqExactMerge(uniqAmt)
from test1.MV1
/* where seriesId = .. */
group by seriesId
- рассмотрите возможность использования uniqCombined вместо uniqExact для оптимизации потребления памяти
Комментарии:
1. привет, я снова столкнулся с аналогичной проблемой, но, похоже, она плохо работает. Если у меня есть таблица с добавочными вставками, скажем, 20 раз в день, и я хочу, чтобы баланс счета (финансовый) был агрегирован по всем этим вставкам транзакций, я не получаю правильные значения.