文档中心MogDBMogDB StackUqbar

文档:v2.0

支持的版本:

其他版本:

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()函数列,创建失败。

  1. 创建源时序表。

    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;
  2. 创建持续聚合,目标时序表有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;
  3. 查询不到持续聚合元数据。

    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;
  4. 查询不到目标时序表信息。

    • 查询时序表元数据,查询失败。

      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';
Copyright © 2011-2024 www.enmotech.com All rights reserved.