Агрегированный Материализованный вид

#clickhouse

Вопрос:

Я создаю программу просмотра ключевых показателей эффективности, в которой я должен показывать определенные агрегированные значения в течение 5-6 лет. Поскольку я довольно новичок в CH, я в значительной степени полагаюсь на чтение документации, но иногда мне не хватает примеров.

 CREATE TABLE test1.table1
(
    seriesId Int32,
    amount Int64, 
    txt varchar(100)
) ENGINE = MergeTree()
order by (seriesId)
;
 

Теперь цель состоит в том, чтобы получить материализованное представление, которое делает

  1. сумма всех сумм в серии
  2. подсчет (отдельный) всех сумм в серии
  3. мин (сумма)
  4. максимальное (количество)

я выяснил, как использовать 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 раз в день, и я хочу, чтобы баланс счета (финансовый) был агрегирован по всем этим вставкам транзакций, я не получаю правильные значения.