---
# System prepended metadata

title: кликхауз  для хранения метрик

---

# кликхауз  для хранения метрик 


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)










