Создадим одну таблицу, вставим четыре строки и проверим агрегацию вручную. Нужны работающий сервер и открытый клиент из урока установки.
Создать таблицу
Выполняйте SQL в clickhouse-client, а не в оболочке терминала. Используем отдельную учебную базу и таблицу first_metrics:
CREATE DATABASE IF NOT EXISTS deshka_ch;
CREATE TABLE deshka_ch.first_metrics
(
id UInt64,
source LowCardinality(String),
value UInt32
)
ENGINE = MergeTree
ORDER BY (source, id);id обозначает номер измерения, source — источник, value — его неотрицательное значение. MergeTree хранит строки, а ORDER BY организует их по источнику и номеру внутри частей. Он не проверяет уникальность id.
Если таблица уже существует, CREATE TABLE сообщит об этом. Не продолжайте автоматически старое упражнение: сначала посмотрите его данные или выберите другое имя своей учебной таблицы.
Вставить четыре строки
INSERT INTO deshka_ch.first_metrics VALUES
(1, 'api', 100),
(2, 'api', 200),
(3, 'worker', 50),
(4, 'worker', 150);Все строки переданы одной вставкой. Повтор этой команды добавит ещё четыре строки: обычный MergeTree не удаляет повторы по id.
Посмотрите исходный набор:
SELECT id, source, value
FROM deshka_ch.first_metrics
ORDER BY id;ORDER BY запроса задаёт порядок вывода независимо от физической сортировки таблицы.
Агрегировать
SELECT
source,
count() AS measurements,
sum(value) AS total,
avg(value) AS mean
FROM deshka_ch.first_metrics
GROUP BY source
ORDER BY source;| source | measurements | total | mean |
|---|---|---|---|
| api | 2 | 300 | 150 |
| worker | 2 | 200 | 100 |
GROUP BY создаёт одну группу на источник. count() считает её строки, sum(value) складывает значения, avg(value) делит сумму на количество. Для api это (100 + 200) / 2 = 150; для worker — (50 + 150) / 2 = 100.
Контроль всего набора:
SELECT count() AS measurements, sum(value) AS total
FROM deshka_ch.first_metrics;Ожидается 4 и 500. Если получилось 8 и 1000, вероятно, вставка выполнена дважды. Это показывает разницу между организацией ключа и уникальностью.
Добавьте к агрегирующему запросу WHERE value >= 150 перед GROUP BY. До группировки останутся значения 200 и 150: по одной строке у каждого источника. HAVING, в отличие от WHERE, фильтровал бы уже рассчитанные группы.
Выйдите из клиента командой exit. Остановка сервера способом из урока установки сохраняет таблицу: после повторного запуска из той же папки или с тем же Docker volume её можно прочитать снова.