跳到主要内容
跳到主要内容

基本时间序列操作

ClickHouse 提供了多种方法来处理时间序列数据,允许您在不同时间段内聚合、分组和分析数据点。 本节涵盖了在处理基于时间的数据时常用的基本操作。

常见的操作包括按时间间隔分组数据、处理时间序列数据中的缺口以及计算时间段之间的变化。 这些操作可以使用标准 SQL 语法结合 ClickHouse 内置的时间函数来执行。

我们将使用 Wikistat(维基百科页面查看数据)数据集来探索 ClickHouse 的时间序列查询能力:

首先,让我们用 10 亿条记录填充这个表:

按时间桶聚合

最常见的需求是基于时间段聚合数据,例如获取每天的总点击量:

我们在这里使用了 toDate() 函数,该函数将指定的时间转换为日期类型。 或者,我们可以按小时进行分批,并过滤特定日期:

这里使用的 toStartOfHour() 函数将给定的时间转换为小时的开始时间。 您还可以按年、季度、月份或天进行分组。

自定义分组间隔

我们甚至可以按任意间隔分组,例如,使用 5 分钟的间隔通过 toStartOfInterval() 函数。

假设我们想按 4 小时的间隔进行分组。 我们可以使用 INTERVAL 子句来指定分组间隔:

或者我们可以使用 toIntervalHour() 函数

无论哪种方式,我们都会得到以下结果:

填充空组

在许多情况下,我们处理的是稀疏数据,其中某些间隔缺失。这会导致空桶。 让我们取以下示例,在该示例中按 1 小时的间隔分组数据。这将输出以下统计数据,但有些小时缺少值:

ClickHouse 提供了 WITH FILL 修饰符来解决此问题。 这将用零填充所有空小时,以帮助我们更好地理解随时间的分布:

滚动时间窗口

有时,我们不想处理间隔的开始(如一天或一小时的开始),而是窗口间隔。 假设我们想了解一个窗口的总点击量,而不是根据天,而是基于从下午 6 点开始的 24 小时周期。

我们可以使用 date_diff() 函数计算参考时间与每条记录时间之间的差异。 在这种情况下,day 列将表示天数的差异(例如,一天前、两天前等):