Агрегатная функция Clickhouse uniqExact работает некорректно

#clickhouse

#clickhouse

Вопрос:

У меня есть таблица с этой схемой

 event_time DateTime,
field1 String,
field2 String,
field3 String
  

Я хочу создать новую таблицу ( table ) с SummingMergeTree механизмом для агрегирования данных для некоторых онлайн-запросов. Для этого я создаю таблицу следующим образом:

 CREATE TABLE aggregated_table(
  event_day DateTime,
  field1 String,
  field2 String,
  record_num UInt64,
  uniq_field3_state AggregateFunction(uniqExact, String)
)
ENGINE = SummingMergeTree()
ORDER BY (event_day, field1, field2);
  

После этого я вставляю свои данные в новую таблицу:

 INSERT INTO aggregated_table
SELECT
  toStartOfDay(event_time) as event_day,
  field1,
  field2,
  count(*) AS request_num,
  uniqExactState(field3) As uniq_field3_state
FROM table
GROUP BY event_day, field1, field2;

  

Теперь, когда я запрашиваю, чтобы найти uniqExact field3 :

 select uniqExact(uniq_field3_state) from aggregated_table;
  

мой ответ:

 ┌─uniqExact(uniq_field3_state)─┐
│                       356948 │
└──────────────────────────────┘
  

но когда я запрашиваю исходную таблицу, мой ответ:

 ┌─uniqExact(field3)─┐
│             15548 │
└───────────────────┘
  

Есть ли какие-либо проблемы с этим рабочим процессом?

Ответ №1:

Вы должны завершить вычисления состояний с помощью функций -Merge Или -Finalize.

В вашем примере вы должны использовать uniqExactMerge не uniqExact.

 select uniqExactMerge(uniq_field3_state) 
from aggregated_table;