我在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 分钟获得每个指标的数量。
我不知道如何使用聚合来解决这个问题
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)
| 归档时间: |
|
| 查看次数: |
8795 次 |
| 最近记录: |