# кликхауз для хранения метрик
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')
```
основная таблица будет содержать все эти строки:

а view будет содержать только последние данные по mac
