deшка
Урок 10.20

Практика: первая таблица и агрегация

Четыре строки, создание MergeTree и понятный результат count, sum и avg.

Создадим одну таблицу, вставим четыре строки и проверим агрегацию вручную. Нужны работающий сервер и открытый клиент из урока установки.

Создать таблицу

Выполняйте 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;
sourcemeasurementstotalmean
api2300150
worker2200100

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 её можно прочитать снова.

Войти, чтобы отмечатьдальше →
10.21 →Практика: журнал запусков → дневная витрина