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

填补时间序列数据中的空白

在处理时间序列数据时,由于数据缺失或不活跃,可能会出现数据空白。
通常,我们不希望在查询数据时存在这些空白。在这种情况下,WITH FILL子句会非常有用。
本指南讨论如何使用WITH FILL填补时间序列数据中的空白。

设置

想象一下,我们有以下表格用于存储由GenAI图像服务生成的图像元数据:

让我们导入一些记录:

按区间查询

我们将探索2023年3月24日的00:24:0300:24:04之间创建的图像,因此让我们为这些时间点创建一些参数:

接下来,我们将编写一个查询,将数据分组为100毫秒的区间,并返回在该区间内创建的图像数量:

结果集只包括创建图像的区间,但是对于时间序列分析,我们可能希望返回每个100毫秒的区间,即使它没有任何条目。

WITH FILL

我们可以使用WITH FILL子句来填补这些空白。
我们还将指定STEP,即要填补的间隔大小。
对于DateTime类型,默认间隔为1秒,但我们想要填补100毫秒的间隔,因此让我们将步幅值设置为100毫秒:

我们可以看到间隔内的空白已用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,而我们更希望它使用累计列中的前一个值。
我们可以使用INTERPOLATE子句来实现这一点,如下所示:

看起来好多了。
最后,让我们使用bar函数添加一个柱状图,别忘了将我们的新列包含在INTERPOLATE子句中。