# кликхауз для хранения метрик 1. создаем таблицу для хранения историй изменений, это будут метрики ``` CREATE TABLE IF NOT EXISTS sys_metrics ( timestamp DateTime, mac String, temperature Nullable(Float32), pressure Nullable(Float32), status String ) ENGINE = MergeTree ORDER BY (mac,timestamp); ``` 2. создаем materialized view для хранения только последних значений. имеет одинаковую стуктуру что и основная таблица. берем нужный движек таблицы и описываем какое поле является версий `ReplacingMergeTree(timestamp)`, и описываем какое поле у нас ключевое - `ORDER BY (mac)` ``` create materialized view IF NOT EXISTS sys_metrics_mv (timestamp DateTime, mac String, temperature Nullable(Float32), pressure Nullable(Float32), status String) engine = ReplacingMergeTree(timestamp) ORDER BY (mac) AS SELECT * FROM sys_metrics ``` 3. теперь при вставке данных в основную таблицу будет обновляться view и будет содержать последние значения строк, пример: ``` INSERT INTO sys_metrics (timestamp, mac, temperature, pressure, status) VALUES (now(), '647fda0121110000', -1.0, 1.0, 'ok'), (now() + 1, '647fda0121110000', -1.0, 4.0, 'ok'), (now() + 2, '647fda0121110000', -1.0, 3.0, 'ok'), (now() + 3, '647fda0121110000', null, 23.0, 'ok'), (now() + 6, '647fda0121110000', -1.0, 1.0, 'ok'), (now() + 7, 'b0fd0b70067c0000', 100.0, 4.0, 'ok'), (now() + 8, 'b0fd0b70067c0000', 100.0, null, 'ready'), (now() + 9, 'b0fd0b70067c0000', 102.0, 23.0, 'ok'), (now() - 12312312, 'b0fd0b70067c0000', 77.0, 23.0, 'ok') ``` основная таблица будет содержать все эти строки: ![](https://i.imgur.com/7jE8vKN.png) а view будет содержать только последние данные по mac ![](https://i.imgur.com/Wn9Mj0i.png)