Skip to main content
在处理时间序列数据时,可能会由于数据缺失或活动中断而出现数据空缺。 通常,我们不希望在查询数据时存在这些空缺。在这种情况下,WITH FILL 子句就很有用。 本指南将介绍如何使用 WITH FILL 来填补时间序列数据中的空缺。

设置

假设我们有下面这张表,用于存储 GenAI 图像服务生成的图像元数据:
接下来导入一些记录:

按时间桶查询

我们将查看 2023 年 3 月 24 日 00:24:0300:24:04 之间创建的图像,因此先为这些时间点创建一些参数:
接下来,我们将编写一个查询,将数据按 100 毫秒分桶,并返回每个时间桶中创建的图像数量:
结果集只包含创建过图像的那些时间桶,但对于时间序列分析,我们可能希望返回每个 100ms 的时间桶,即使其中没有任何数据。

WITH FILL

我们可以使用 WITH FILL 子句来补齐这些空缺。 我们还会指定 STEP,即要补齐的间隔大小。 对于 DateTime 类型,默认值是 1 秒,但这里我们想补齐长度为 100ms 的空缺,因此将 100ms 的时间间隔作为步长值:
我们可以看到,count 列中的空缺已用 0 值填补。

WITH FILL…FROM

不过,时间范围起始处仍然有一个空缺,我们可以通过指定 FROM 来补上:
从结果可以看出,00:24:03.00000:24:03.500 之间的所有时间桶现在都出现了。

WITH FILL…TO

不过,时间范围末尾仍然缺少一些时间桶,我们可以通过指定 TO 值来补齐。 TO 不包含结束边界,因此我们会在结束时间上加上一个很小的增量,以确保它被包含在内:
现在所有间隔都已补齐,我们已经有了从 00:24:03.00000:24:05.000 每 100 毫秒一条的记录。

累计计数

假设我们现在想要统计跨所有时间桶创建的图像数量累计值。 我们可以通过添加一个 cumulative 列来实现,如下所示:
累计列中的值并不像我们希望的那样起作用。

WITH FILL…INTERPOLATE

凡是 count 列中值为 0 的行,其累计列中的值也都是 0,而我们更希望这里使用 cumulative 列中的前一个值。 如下所示,我们可以通过使用 INTERPOLATE 子句来实现这一点:
这样看起来好多了。 现在再做最后一步:使用 bar 函数添加一个条形图,别忘了把新列也加到 INTERPOLATE 子句中。
最后修改于 2026年7月3日