如何获得每1分钟或1天的计数日期时间,

mlmc2os5  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(509)

我在clickhouse有一张table。用于保存统计数据和度量。
结构如下:

datetime|metric_name|metric_value

我想保持统计和限制数量的访问在1分钟,1小时,1天等。所以我需要在最后一分钟,每小时或每一天的事件计数,我想准备一个图表统计。
我不知道该怎么问。我得到的统计指标计数的基础上准确的例如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分钟每一个度量的数量。
我不知道如何使用聚合解决这个问题

pes8fvy9

pes8fvy91#

clickhouse具有生成日期/日期时间组存储桶的功能,例如tostartofweek、tostartofhour、tostartoffiveminute。你也可以使用 intDiv 函数手动划分值范围。然而 fill 功能仍在路线图中。
例如,您可以重写inflow sql,而不必像这样填充clickhouse,

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)

相关问题