time_bucket_gapfill()
功能描述
time_bucket_gapfill 在time_bucket 的基础上增加了对数据缺失的时间段进行填值的功能。
语法格式
time_bucket_gapfill(bucket_width, time, start_time , finish_time)
参数说明
参数名 | 类型 | 属性 | 释义 |
---|---|---|---|
bucket_width | TEXT | 必选 | 对齐的时间间隔。只能使用'正整数+时间标识'的方式,时间标识包括: interval 支持的所有单位,包括'microsecond,millisecond,second,minute,hour,day,week,month,year,decade,century,millennium' 及这些单位的复数形式,如 years, months,days 等和简写形式,如 y, m, d 等。 |
time | TIMESTAMP | 必选 | 需要对齐的时间。 |
start_time | TIMESTAMP | 可选 | 需要gapfill的开始的时间(比方结果集中没有某个时间,但是需要查询结果中有这个时间)。如果不指定此参数需要在where条件中指定。 |
finish_time | TIMESTAMP | 可选 | 需要gapfill的结束的时间(比方结果集中没有某个时间,但是需要查询结果中有这个时间)。如果不指定此参数需要在where条件中指定。 |
举例:
系统中有6条时序数据,时间格式中缺省年月日信息。
time | 00:00:00 | 00:01:00 | 00:15:00 | 00:36:00 | 00:45:00 | 01:06:00 |
---|---|---|---|---|---|---|
value | 30 | 31 | 32 | 33 | NULL | 34 |
对以上数据计算按照 10min 一个窗口计算平均值,结果如下:
time | 00:00:00 | 00:10:00 | 00:30:00 | 00:40:00 | 01:00:00 | ||
---|---|---|---|---|---|---|---|
avg | 30.5 | 32 | 33 | NULL | 34 |
由于其中一些时间窗口内没有时序数据上报,时间窗口内无聚合结果。time_bucket_gapfill 的作用是按照一定规则对这些时间窗口填值,从而生成时间窗口内的聚合结果。
系统提供了一些填值函数与 time_bucket_gapfill 一起使用,用于按照指定规则对缺少值进行填充。
-
locf(value[, prev, treat_null_as_missing])
与time_bucket_gapfill一起使用,使用上一个窗口的值进行填充。
参数名 类型 属性 释义 value ANY 必选 需要填充的值表达式。 prev EXPRESSION 可选 如果没有找到前一个值,则使用此表达式寻值。 treat_null_as_missing BOOLEAN 可选 不向后携带空值。默认值false。 例如事件窗口 00:20:00 填充值是上一个窗口 00:10:00 聚合结果 32。
time 00:00:00 00:10:00 00:20:00 00:30:00 00:40:00 00:50:00 01:00:00 avg 30.5 32 32 33 NULL NULL 34 当我们在locf函数中设置了参数treat_null_as_missing => true后,会将null当作缺失的值进行填充。
time 00:00:00 00:10:00 00:20:00 00:30:00 00:40:00 00:50:00 01:00:00 avg 30.5 32 32 33 33 33 34 -
interpolate(value[, prev[, next]])
对缺失数据线性插值填充,即取上一个窗口和下一个窗口的平均值,如果上一个窗口和下一个窗口不存在,则值取为空。
参数名 类型 属性 释义 value ANY 必选 需要填充的值表达式。 prev EXPRESSION 可选 如果没有计算插值的前序值,那么使用此表达式寻值代替前序值。 next EXPRESSION 可选 如果没有计算插值的后序值,那么使用此表达式寻值代替后序值。 举例:
00:20:00 窗口的填充值为 00:10:00 窗口和 00:30:00 窗口聚合值的平均值。
time 00:00:00 00:10:00 00:20:00 00:30:00 00:40:00 00:50:00 01:00:00 avg 30.5 32 32.5 33 NULL NULL 34
约束
-
在同一级查询中只能有一个time_bucket_gapfill函数。
-
使用插值函数必须在函数参数或where条件中指定 start_time 和 finish_time。
-
start_time <= finish_time。
-
返回结果自动按 time列 升序排列。
示例
创建持续聚合,目标时序表有time_bucket_gapfill()函数列,创建失败。
-
创建源时序表。
CREATE TIMESERIES TABLE t_uqbar_ca_create_case0008_1(time timestamp TSTIME, city text TSTAG, temperature float); insert into t_uqbar_ca_create_case0008_1 values ('2023-02-14 06:00:00','beijing',14.4); select * from timeseries_views.tstable;
-
创建持续聚合,目标时序表有time_bucket_gapfill()函数列,失败。
CREATE CONTINUOUS AGGREGATION IF NOT EXISTS agg_ca_create_case0008_1 EVERY '1 year' START_OFFSET '10 year' END_OFFSET '1h' AS SELECT time_bucket_gapfill('1 h',time) as bucket,city,avg(temperature) FROM t_uqbar_ca_create_case0027_1 GROUP BY bucket,city ORDER BY bucket;
-
查询不到持续聚合元数据。
select ca_schema,ca_name,resample_time,resample_interval,start_offset,end_offset,query from timeseries_catalog.continuous_aggregation; select * from timeseries_views.continuous_aggregation;
-
查询不到目标时序表信息。
-
查询时序表元数据,查询失败。
select timecol,tagcol from timeseries_catalog.tstable; select tablename,timecolname,tagcol,tspolicy from timeseries_views.tstable; select * from agg_ca_create_case0027_1;
-
查询目标表的列字段信息,查询失败。
SELECT col_description(a.attrelid,a.attnum) as comment,format_type(a.atttypid,a.atttypmod) as type,a.attname as name, a.attnotnull as notnull FROM pg_class as c,pg_attribute as a where c.relname = 'agg_ca_create_case0027_1' and a.attrelid = c.oid and a.attnum>0;
-
查询后台任务视图,没有目标表任务。
select * from timeseries_catalog.bgw_job; select * from timeseries_views.bgw_job; SELECT ca.ca_name, ca.resample_interval, job.interval ,as job_interval FROM timeseries_catalog.continuous_aggregation AS ca LEFT JOIN pg_job AS job ON ca.job_id = job.job_id WHERE ca.ca_name = 'agg_ca_create_case0027_1';
-