Skip to main content
ClickHouse 提供了多种处理时间序列数据的方法,让您能够跨不同时间段对数据点进行聚合、分组和分析。 本节将介绍处理时序数据时常用的一些基础操作。 常见操作包括按时间间隔对数据分组、处理时间序列数据中的空缺,以及计算不同时间段之间的变化。 这些操作都可以通过标准 SQL 语法结合 ClickHouse 内置的时间函数来完成。 接下来,我们将使用 Wikistat (Wikipedia 页面浏览数据) 数据集来了解 ClickHouse 的时间序列查询能力:
我们来向这个表插入 10 亿条记录:

按时间桶聚合

最常见的需求是按时间段对数据进行聚合,例如获取每天的总点击量:
这里我们使用了 toDate() 函数,它会将指定时间转换为日期类型。或者,我们也可以按小时分组,并按特定日期进行过滤:
这里使用的 toStartOfHour() 函数会将给定时间转换为该小时的开始时刻。 你也可以按年、季度、月或天分组。

自定义分组时间间隔

我们甚至可以按任意时间间隔进行分组,例如使用 toStartOfInterval() 函数按 5 分钟间隔分组。 假设我们想按 4 小时间隔分组。 我们可以使用 INTERVAL 子句来指定分组间隔:
或者也可以使用 toIntervalHour() 函数
无论采用哪种方式,结果如下:

填充空组

很多情况下,我们处理的是存在部分时间间隔缺失的稀疏数据,这会导致出现空桶。以下示例按 1 小时时间间隔对数据分组,输出的统计结果中会有一些小时缺少值:
ClickHouse 提供了 WITH FILL 修饰符来解决这个问题。它会将所有缺失的小时用零补齐,这样我们就能更好地理解其随时间变化的分布情况:

滚动时间窗口

有时,我们关注的不是时间间隔的起点 (例如一天或一小时的开始) ,而是滚动窗口的时间间隔。 假设我们想了解某个窗口内的总点击量,不是按自然日统计,而是基于从下午 6 点开始偏移的 24 小时时间段。 我们可以使用 date_diff() 函数来计算参考时间与每条记录时间之间的差值。 在这种情况下,day 列表示相差的天数 (例如 1 天前、2 天前等) :
最后修改于 2026年7月3日