介绍
按时间间隔聚合数据,同时填充缺失数据的间隙。
time_bucket_gapfill
的工作原理类似于 time_bucket
,但增加了间隙填充功能。此组中的其他函数必须与 time_bucket_gapfill
在同一个查询中使用。它们控制如何处理缺失值。
重要
time_bucket_gapfill
必须用作查询或子查询中的顶级表达式。例如,您不能将 time_bucket_gapfill
嵌套在另一个函数中(例如 round(time_bucket_gapfill(...))
),也不能将间隙填充调用的结果进行强制转换。如果您需要进行强制转换,可以在子查询中使用 time_bucket_gapfill
,并让外部查询进行类型强制转换。
桶
- time_bucket_gapfill
- 按时间间隔将行分组,同时填充数据中的间隙
插值器
- interpolate
- 通过线性插值填充缺失值
- locf
- 通过将最后观察到的值向前推进以填充缺失值
time_bucket_gapfill(bucket_width INTERVAL | INTEGER,time TIMESTAMPTZ | INTEGER,[, timezone TEXT][, start TIMESTAMPTZ | INTEGER][, finish TIMESTAMPTZ | INTEGER]) RETURNS TIMESTAMPTZ
将数据分组到基于时间间隔的桶中,同时填充缺失数据的间隙。如果您没有提供间隙填充算法,例如 locf
或 interpolate
,则间隙将在返回的数据中以 NULL
表示。
必需参数
名称 | 类型 | 描述 |
---|---|---|
bucket_width | INTERVAL , INTEGER | 一个 PostgreSQL 时间间隔,用于指定每个桶的长度。例如,使用 1 day 获取每日桶。如果您的时间列是基于整数的,则仅使用 INTEGER 。 |
time | TIMESTAMPTZ , INTEGER | 用于确定桶的时间戳 |
可选参数
名称 | 类型 | 描述 |
---|---|---|
timezone | TEXT | 用于分组的时间区域。例如,Europe/Berlin 。在 TimescaleDB 2.9 或更高版本中可用。不适用于基于整数的时间。如果您有一个未类型的 start 或 finish 参数和一个 timezone 参数,您可能会遇到一个问题,即您没有为预期的参数传递参数。要解决此问题,请命名您的参数或显式地对其进行类型转换。 |
start | TIMESTAMPTZ , INTEGER | 要进行间隙填充的时期的开始。start 之前的值将被传递,但不会执行间隙填充。如果您的时间列是基于整数的,则仅使用 INTEGER 。最佳做法是使用 WHERE 子句。指定 start 是遗留行为。WHERE 性能更高,因为查询规划器可以通过约束排除过滤掉分块。 |
finish | TIMESTAMPTZ , INTEGER | 要进行间隙填充的时期的结束。finish 之后的值将被传递,但不会执行间隙填充。如果您的时间列是基于整数的,则仅使用 INTEGER 。最佳做法是使用 WHERE 子句。指定 finish 是遗留行为。WHERE 性能更高,因为查询规划器可以通过约束排除过滤掉分块。 |
返回值
列 | 类型 | 描述 |
---|---|---|
time_bucket_gapfill | TIMESTAMPTZ | 时间桶的开始时间。 |
interpolate(value SMALLINT | INTEGER | BIGINT | REAL | DOUBLE PRECISION[, prev EXPRESSION][, next EXPRESSION]) RETURNS SMALLINT | INTEGER | BIGINT | REAL | DOUBLE PRECISION
通过线性插值填充缺失值。与 time_bucket_gapfill
在同一个查询中使用。interpolate
不能嵌套在另一个函数调用中。
必需参数
名称 | 类型 | 描述 |
---|---|---|
value | SMALLINT , INTEGER , BIGINT , REAL , DOUBLE PRECISION | 要进行插值的价值 |
可选参数
名称 | 类型 | 描述 |
---|---|---|
prev | 表达式 | 如果间隙填充没有可用的前一个值,请使用 prev 查找表达式来获取前一个值。例如,您可以使用 prev 来填充查询时间范围内的第一个桶。表达式必须返回一个 (time, value) 元组,其类型与分组的时间和值相对应。 |
next | 表达式 | 如果间隙填充没有可用的下一个值,请使用 next 查找表达式来获取下一个值。例如,您可以使用 next 来填充查询时间范围内的最后一个桶。表达式必须返回一个 (time, value) 元组,其类型与分组的时间和值相对应。 |
返回值
列 | 类型 | 描述 |
---|---|---|
interpolate | SMALLINT , INTEGER , BIGINT , REAL , DOUBLE PRECISION | 间隙填充的值。返回类型是 value 的类型。 |
locf(value ANY ELEMENT[, prev EXPRESSION][, treat_null_as_missing BOOLEAN]) RETURNS ANY ELEMENT
通过将最后观察到的值向前推进以填充缺失值。与 time_bucket_gapfill
在同一个查询中使用。locf
不能嵌套在另一个函数调用中。
必需参数
名称 | 类型 | 描述 |
---|---|---|
value | 任意元素 | 要向前推进的值 |
可选参数
名称 | 类型 | 描述 |
---|---|---|
prev | 表达式 | 如果间隙填充没有可用的前一个值,请使用 prev 查找表达式来获取前一个值。例如,您可以使用 prev 来填充查询时间范围内的第一个桶。 |
treat_null_as_missing | 布尔值 | 当为 true 时,NULL 值将被忽略,并且只有非 NULL 值会被向前推进。 |
返回值
列 | 类型 | 描述 |
---|---|---|
locf | 任意元素 | 间隙填充的值。返回类型是 value 的类型。 |
获取每日平均指标值。使用 time_bucket_gapfill
而不指定间隙填充算法。这会将缺失值保留为 NULL
SELECT time_bucket_gapfill('1 day', time) AS day,avg(value) as valueFROM metricsWHERE time > '2021-12-31 00:00:00+00'::timestamptzAND time < '2022-01-10 00:00:00-00'::timestamptzGROUP BY dayORDER BY day desc;
day | value-----------------------+--------------------2022-01-09 00:00:00+00 |2022-01-08 00:00:00+00 | 48.612931559931082022-01-07 00:00:00+00 | 54.3882675259864852022-01-06 00:00:00+00 |2022-01-05 00:00:00+00 | 58.2575206347852662022-01-04 00:00:00+00 | 46.091724242617652022-01-03 00:00:00+00 | 42.534987078200272022-01-02 00:00:00+00 |2022-01-01 00:00:00+00 | 47.844200014159752021-12-31 00:00:00+00 |(10 rows)
获取每日平均指标值。如果缺少值,使用 locf
将最后一个值向前推进。请注意,avg
嵌套在 locf
中,而不是相反。
SELECT time_bucket_gapfill('1 day', time) AS day,locf(avg(value)) as valueFROM metricsWHERE time > '2021-12-31 00:00:00+00'::timestamptzAND time < '2022-01-10 00:00:00-00'::timestamptzGROUP BY dayORDER BY day desc;
day | value-----------------------+--------------------2022-01-09 00:00:00+00 | 48.612931559931082022-01-08 00:00:00+00 | 48.612931559931082022-01-07 00:00:00+00 | 54.3882675259864852022-01-06 00:00:00+00 | 58.2575206347852662022-01-05 00:00:00+00 | 58.2575206347852662022-01-04 00:00:00+00 | 46.091724242617652022-01-03 00:00:00+00 | 42.534987078200272022-01-02 00:00:00+00 | 47.844200014159752022-01-01 00:00:00+00 | 47.844200014159752021-12-31 00:00:00+00 |(10 rows)
获取每日平均指标值。如果缺少值,使用 interpolate
对其进行线性插值。请注意,avg
嵌套在 interpolate
中。
SELECT time_bucket_gapfill('1 day', time) AS day,interpolate(avg(value)) as valueFROM metricsWHERE time > '2021-12-31 00:00:00+00'::timestamptzAND time < '2022-01-10 00:00:00-00'::timestamptzGROUP BY dayORDER BY day desc;
day | value-----------------------+--------------------2022-01-09 00:00:00+00 |2022-01-08 00:00:00+00 | 48.612931559931082022-01-07 00:00:00+00 | 54.3882675259864852022-01-06 00:00:00+00 | 56.322894080385882022-01-05 00:00:00+00 | 58.2575206347852662022-01-04 00:00:00+00 | 46.091724242617652022-01-03 00:00:00+00 | 42.534987078200272022-01-02 00:00:00+00 | 45.1895935461800142022-01-01 00:00:00+00 | 47.844200014159752021-12-31 00:00:00+00 |(10 rows)
获取每日平均指标值,使用 Europe/Berlin
作为时间区域。请注意,每日时间桶现在从 23:00 UTC
开始,这相当于所选日期的柏林午夜
SELECT time_bucket_gapfill('1 day', time, 'Europe/Berlin') AS day,interpolate(avg(value)) as valueFROM metricsWHERE time > '2021-12-31 00:00:00+00'::timestamptzAND time < '2022-01-10 00:00:00-00'::timestamptzGROUP BY dayORDER BY day desc;
day | value-----------------------+--------------------2022-01-09 23:00:00+00 |2022-01-08 23:00:00+00 | 48.650791279137032022-01-07 23:00:00+00 | 47.318477770991542022-01-06 23:00:00+00 | 55.988457403438592022-01-05 23:00:00+00 | 55.616674017771082022-01-04 23:00:00+00 | 58.741155745220122022-01-03 23:00:00+00 | 45.779936359882732022-01-02 23:00:00+00 | 41.786899234532022022-01-01 23:00:00+00 | 24.3243134777439742021-12-31 23:00:00+00 | 48.866803776612612021-12-30 23:00:00+00 |(11 rows)
关键字