Clickhouse - 如何计算每 1 分钟或 1 天的日期时间,
clickhouse - how get count datetime per 1minute or 1day ,
我在 Clickhouse 中有一个 table。用于保留统计信息和指标。
结构是:
datetime|metric_name|metric_value
我想在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)
其实我想获取前1小时内每5分钟每个metric的数量
我不知道如何使用聚合来解决这个问题
ClickHouse 具有生成 Date/DateTime 组桶的功能,例如 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)
也可以参考这个讨论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)
我在 Clickhouse 中有一个 table。用于保留统计信息和指标。
结构是:
datetime|metric_name|metric_value
我想在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)
其实我想获取前1小时内每5分钟每个metric的数量
我不知道如何使用聚合来解决这个问题
ClickHouse 具有生成 Date/DateTime 组桶的功能,例如 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)
也可以参考这个讨论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)