#1
This guide shows how to use ClickHouse as a time-series database with Spring Boot for storing and querying time-based data.

1. Create a Time-Series Table

ClickHouse supports time-series with MergeTree engines.
CREATE TABLE metrics (
  timestamp DateTime,
  service String,
  value Float32
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(timestamp)
ORDER BY (service, timestamp);

2. Spring Boot Configuration

spring.datasource.url=jdbc:clickhouse://localhost:8123/default
spring.datasource.username=default
spring.datasource.password=
spring.datasource.driver-class-name=com.clickhouse.jdbc.ClickHouseDriver

3. Define an Entity

@Entity
@Table(name = "metrics")
public class Metric {
    @Id
    private LocalDateTime timestamp;
    private String service;
    private Float value;
}

4. Repository for Time-Series

public interface MetricRepository extends JpaRepository<Metric, LocalDateTime> {
    @Query(value = "SELECT * FROM metrics WHERE service = :service AND timestamp BETWEEN :start AND :end ORDER BY timestamp", nativeQuery = true)
    List<Metric> findByServiceAndTimeRange(String service, LocalDateTime start, LocalDateTime end);
}

5. Insert Metrics

Metric metric = new Metric();
metric.setTimestamp(LocalDateTime.now());
metric.setService("payment");
metric.setValue(23.7f);
repo.save(metric);

6. Query Data by Time Range

List<Metric> results = repo.findByServiceAndTimeRange(
    "payment",
    LocalDateTime.now().minusHours(1),
    LocalDateTime.now()
);

7. Aggregations for Analysis

@Query(value = "SELECT toStartOfMinute(timestamp) as minute, avg(value) as avgValue " +
               "FROM metrics WHERE service=:service GROUP BY minute ORDER BY minute", nativeQuery = true)
List<Object[]> avgPerMinute(String service);

image quote pre code