clickhouse - 如何计算每 1 分钟或 1 天的日期时间,

azi*_*nia 5 clickhouse

我在Clickhouse有一张桌子。用于保持统计数据和指标。
和结构是:

datetime|metric_name|metric_value
Run Code Online (Sandbox Code Playgroud)

我想保留统计信息并限制 1 分钟、1 小时、1 天等的访问次数。所以我需要每个 metric_name 的最后一分钟、一小时或一天的事件计数,我想在图表中准备统计数据。
我不知道如何进行查询。我根据确切的时间(例如 1 分钟、1 小时、1 天等)获取指标统计信息的计数。

我曾经在inflxdb上工作:

SELECT SUM(value) FROM `TABLE` WHERE `metric_name`=`metric_value` AND time >= now() - 1h GROUP BY time(5m) fill(0)
Run Code Online (Sandbox Code Playgroud)

事实上,我想在前 1 小时内每 5 分钟获得每个指标的数量。

我不知道如何使用聚合来解决这个问题

Amo*_*mos 6

ClickHouse 具有生成日期/日期时间组桶的功能,例如 toStartOfWeek、toStartOfHour、toStartOfFiveMinute。您还可以使用intDiv函数来手动划分值范围。但是,该fill功能仍在路线图中。

比如你可以像这样在不填写ClickHouse的情况下重写influx sql,

SELECT SUM(value) FROM `TABLE` WHERE `metric_name`=`metric_value` AND 
time >= now() - 1h GROUP BY toStartOfFiveMinute(time)
Run Code Online (Sandbox Code Playgroud)

你也可以参考这个讨论https://github.com/yandex/ClickHouse/issues/379

更新

有一个timeSlots函数可以帮助生成空桶。这是一个工作示例

SELECT
    slot,
    metric_value_sum
FROM
(
    SELECT
        toStartOfFiveMinute(datetime) AS slot,
        SUM(metric_value) AS metric_value_sum
    FROM metrics
    WHERE (metric_name = 'k1') AND (datetime >= (now() - toIntervalHour(1)))
    GROUP BY slot
)
ANY RIGHT JOIN
(
    SELECT arrayJoin(timeSlots(now() - toIntervalHour(1), toUInt32(3600), 300)) AS slot
) USING (slot)
Run Code Online (Sandbox Code Playgroud)

  • 这是每 10 秒舍入一次的表达式 `toDateTime(intDiv(toUInt32(now()), 10) * 10);` 希望你能明白 (2认同)