文档首页 > > 开发指南> 时序引擎>

时序函数

时序函数

分享
更新时间:2021/04/25 GMT+08:00

时序计算函数一览表

表1 时序计算支持的函数一览

功能

函数

对分组内时间窗口内缺失时间值进行补充,默认按照时间排序。

time_fill()

对分组内时间窗口下缺失的聚合值按前向查找方式用最近所见值进行插值补充。

fill_last()

对分组内时间窗口下缺失的聚合值按后向查找方式用最近所见值进行插值补充。

fill_first()

对分组内时间窗口下缺失的聚合值按均值查找方式用最近所见值进行插值补充。

fill_avg()

按照任意的时间窗口大小对时间戳类型进行取模运算。

time_window()

对给得定的列按照时间序列排序第一个值。

first()

对给得定的列按照时间序列排序最后一个值。

last()

对给得定的列排序后的百分位值。

percentile_cont()

对每个分组为空的数据进行插值补充。

fill()

对给定的列排序后前K个元组。

top_k()

对给定的列排序后后K个元组。

bottom_k()

用于计算按照时间排序后两行之间的差值。

delta()

该函数用于计算某段时间内最大和最小值得差值。

spread()

对给定的列,返回其中随机N个值。

sample()

对给定的列,返回出现频率最高的值,如果多个值频率相同,返回这些值中最小的那个值。

mode()

对给定的时间和某个列,返回该列在时间下的梯形面积积分。

integral()

time_fill(window_width interval, time timestamp(tz), start timestamp(tz), finish timestamp(tz))

该函数对分组内缺失的时间窗口进行补全,使得数据更完整,补充的值默认按照时间排序。

表2 参数说明

参数名

类型

描述

Required/Option

window_width

interval

每个时间窗的间隔

Required

time

timestamp

时间的Columm

Required

start

timestamp

开始时间

Required

finish

timestamp

结束时间

Required

  • window_width 单位可以为 microsecond, millisecond, second, min, hour, day, week以及正数(默认单位为day)。
  • time_fill 函数需要作为聚合函数使用,group by 需要引用自身计算结果,不支持与自身嵌套使用,不支持单条查询内多次调用,不支持作为下层计算节点使用,不支持与within group使用。
  • start 时间戳的值必须小于 finish 时间戳的值, 且两者间距需要大于window_width的值。
  • 所有参数不支持空值,start和finish需为确定值。
示例:
SELECT
    time_fill(interval '1 min', time, 
              '2019-07-11 23:59:01'::timestamptz, 
              '2019-07-12 00:03:01'::timestamptz) as fill_time
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz),
            ('2019-07-12 00:00:00'::timestamptz)) v(time)
GROUP BY fill_time;

fill_last(value anyelement)

该函数对分组内缺失的时间窗口对应的聚合值进行补全,补全策略是使用最近的上一个时间戳的聚合值。如果所有之前的时间戳为空值,则不补充。

表3 参数说明

参数名

类型

描述

Required/Option

value

anyelement

向前补充的值

Required

  • fill_last 必须与 time_fill 同时使用。
  • 不支持与窗口函数、within group共同使用。
示例:
SELECT
    time_fill(interval '1 min', time, 
              '2019-07-11 23:59:01'::timestamptz, 
              '2019-07-12 00:03:01'::timestamptz) as fill_time,
    fill_last(min(value))
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz,1),
            ('2019-07-12 00:01:00'::timestamptz,3)) v(time,value)
GROUP BY fill_time;

fill_first(value anyelement)

该函数对分组内缺失的时间窗口对应的聚合值进行补全,补全策略是使用最近的下一个时间戳的聚合值。如果所有之后的时间戳为空值,则不补充。

表4 参数说明

参数名

类型

描述

Required/Option

value

anyelement

向后补充的值

Required

  • fill_first 必须与 time_fill 同时使用。
  • 不支持与窗口函数、within group共同使用。
示例:
SELECT
    time_fill(interval '1 min', time, 
              '2019-07-11 23:59:01'::timestamptz, 
              '2019-07-12 00:03:01'::timestamptz) as fill_time,
    fill_first(min(value))
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz,1),
            ('2019-07-12 00:01:00'::timestamptz,3)) v(time,value)
GROUP BY fill_time;

fill_avg(value anyelement)

该函数对分组内缺失的时间窗口对应的聚合值进行补全,补全策略是双向查找最近的聚合值。如果前向查找的时间戳为空值,则用后向查找的时间戳进行补充;如果后向查找的时间戳为空值,则用前向查找的时间戳进行补充;如果双向查找的时间戳都不为空值,则用两个时间戳上的均值进行补充;如果双向查找的时间戳都为空值,则会报错hash table content fill error。

表5 参数说明

参数名

类型

描述

Required/Option

value

anyelement

均值补充的值

Required

  • fill_avg 必须与 time_fill 同时使用。
  • 不支持与窗口函数、within group共同使用。
  • fill_avg 的参数必须是int2,int4,int8或者NUMERIC类型。
示例:
SELECT
    time_fill(interval '1 min', time, 
              '2019-07-11 23:59:01'::timestamptz, 
              '2019-07-12 00:03:01'::timestamptz) as fill_time,
    fill_avg(min(value))
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz, 'red', 1),
            ('2019-07-12 00:01:00'::timestamptz,'blue', 3)) v(time,color, value)
GROUP BY fill_time,color;

time_window(window_width interval, time timestamp(tz), origin timestamp(tz))

按照任意的时间窗口大小对时间戳类型进行取模运算。

表6 参数说明

参数名

类型

描述

Required/Option

window_width

interval

时间窗口

Required

time

timestamp(tz)

时间戳的columm

Required

origin

timestamp(tz)

原始的时间戳

Option

  • window_width 单位可以为 microsecond, millisecond, second, min, hour, day, week以及正数(默认单位为day)。
  • window_width以及time参数类型正确不能为空值。
示例:
SELECT
    time_window(interval '1 min', time),
    time_window(interval '3 min', time,  '2019-07-11 00:02:05'::timestamptz)
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz),
            ('2019-07-12 00:01:01'::timestamptz)) v(time);

first(value_array anyarray, time_array timearray)

对给定的列按照时间序列排序并返回第一个值。

表7 参数说明

参数名

类型

描述

Required/Option

value_array

anyarray

查询列的数组

Required

time_array

timearray

时间值的数组

Required

该函数不支持直接对极大数据量使用。

示例:
SELECT
    first(array_agg(value), array_agg(time))
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz,'c','a'),
            ('2019-07-12 00:01:00'::timestamptz,'b','a'),
            ('2019-07-12 00:02:01'::timestamptz,'a','b')) v(time, value, tag)
GROUP BY tag;

last(value_array anyarray, time_array timearray)

对给定的列按照时间序列排序并返回最后一个值。

表8 参数说明

参数名

类型

描述

Required/Option

value_array

anyarray

查询列的数组

Required

time_array

timearray

时间值的数组

Required

该函数不支持直接对极大数据量使用。

示例:
SELECT
    last(array_agg(value), array_agg(time))
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz,'c','a'),
            ('2019-07-12 00:01:00'::timestamptz,'b','a'),
            ('2019-07-12 00:02:01'::timestamptz,'a','b')) v(time, value, tag)
GROUP BY tag;

percentile_cont(percentile float)

对给定的列按照时间序列排序并返回百分位值。

表9 参数说明

参数名

类型

描述

Required/Option

percentile

float

指定百分位,取值范围[0,1],精度为浮点值,例如0.95为95分位值

Required

  • percentile 为[0,1]之间的小数,精度为浮点值类型,不支持95%写法。
  • 需要与within group (order by) 结合使用,指定分位值的列,且该列类型需要为数值型。
示例:
SELECT 
     percentile_cont(0.5) WITHIN GROUP (ORDER BY value) 
FROM 
    (VALUES ('2019-07-12 00:00:01'::timestamptz,'red',1),
    ('2019-07-12 00:00:01'::timestamptz,'blue',2)) v(time,color,value); 

fill(value anyelement)

对每个分组为空的数据进行插值补充,fill可以对现有数据中的空值进行补充。

表10 参数说明

参数名

类型

描述

Required/Option

Value

anyelement

填充的值

Required

fill 需要与 over窗口函数使用。

示例:
SELECT
   time, 
   CASE WHEN value is not null THEN value else fill(value) over(partition by time) END 
FROM 
   (VALUES ('2019-07-12 00:00:00'::timestamptz, 1),
           ('2019-07-12 00:00:00'::timestamptz, NULL),
           ('2019-07-12 00:02:00'::timestamptz, 3)) v(time,value);

top_k(array real[],k int)

对给定的列按照时间序列排序返回前K个元组。

表11 参数说明

参数名

类型

描述

Required/Option

array

real[]

输入的数组

Required

k

int

指定前K个

Required

  • k为非负数且小于array大小。
  • array不能为空。
  • 该函数不支持直接对极大数据量使用。
示例:
SELECT
     top_k(array_agg(v), 0.5),v2
FROM 
     (VALUES (1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'a'),(6,'a')) v(v,v2) 
GROUP BY v2;

bottom_k(array real[],k int)

对给定的列按照时间序列排序并返回后K个元组。

表12 参数说明

参数名

类型

描述

Required/Option

array

real[]

输入的数组

Required

k

int

指定后K个

Required

  • k 为非负数且小于array大小。
  • array不能为空。
  • 该函数不支持直接对极大数据量使用。
示例:
SELECT
     bottom_k(array_agg(v), 0.5),v2
FROM 
     (VALUES (1,'a'),(2,'a'),(3,'a'),(4,'a'),(5,'a'),(6,'a')) v(v,v2) 
GROUP BY v2;

delta(field numeric)

用于计算按照时间排序后两行之间的差值。

表13 参数说明

参数名

类型

描述

Required/Option

field

数值型

需要计算的列

Required

  • 该函数通常用于时序场景计算按照时间排序后相邻两行插值,用于流量,速度等指标监控。
  • delta是一个窗口函数,需要与over窗口函数使用。并且,over中rows语句不会改变delta函数结果,比如delta(value) over(order by time rows 1 preceding) 和 delta(value) over(order by time rows 3 preceding) 返回的结果是一致的
示例:
SELECT
     delta(value) over (rows 1 preceding)
FROM 
     (VALUES ('2019-07-12 00:00:00'::timestamptz, 1),('2019-07-12 00:01:00'::timestamptz, 2),('2019-07-12 00:02:00'::timestamptz, 3)) v(time,value);

spread(field numeric)

该函数用于计算某段时间内最大和最小值得差值。

表14 参数说明

参数名

类型

描述

Required/Option

field

数值型

需要计算的列

Required

  • 该函数用于时序场景计算每个指标的增量,通常按照时间排序后计算。
  • 每个分组内如果少于2个元组,返回结果为0,不要和over窗口函数混用。
示例:
SELECT
     SPREAD(value)
FROM 
     (VALUES ('2019-07-12 00:00:00'::timestamptz, 1),('2019-07-12 00:01:00'::timestamptz, 2),('2019-07-12 00:02:00'::timestamptz, 3)) v(time,value);

sample(value_array anyarray, N int)

对给定的列,返回其中随机N个值。

表15 参数说明

参数名

类型

描述

Required/Option

value_array

anyarray

查询列的数组

Required

N

int

随机采样个数

Required

  • N需要为正数,且不大于value_array长度。
  • 不能和over子句一起使用。
  • 建议不要在大量数据下使用该函数,因为耗时比较长。
示例:
SELECT
    sample(array_agg(value), 1)
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz, 1),('2019-07-12 00:01:00'::timestamptz, 2),('2019-07-12 00:02:00'::timestamptz, 3)) v(time,value);

mode() within group (order by value anyelement)

对给定的列,返回出现频率最高的值,如果多个值频率相同,返回这些值中最小的那个值。

表16 参数说明

参数名

类型

描述

Required/Option

value

anyelement

查询列

Required

  • 需要与within group一起使用,无within group语句,会报错,该函数参数放在group的order by后面。
  • 不能和over子句一起使用。
示例:
SELECT
    mode() within group (order by value)
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz, 1),('2019-07-12 00:01:00'::timestamptz, 2),('2019-07-12 00:02:00'::timestamptz, 3)) v(time,value);

integral(time_array timestamptz[], value_array double precision[], unit interval)

对给定的时间和某个列,返回该列在时间下的梯形面积积分。

表17 参数说明

参数名

类型

描述

Required/Option

time_array

timestamptz[]

查询时间数组

Required

value_array

double precision[]

查询列的数组

Required

unit

interval

时间单位

Required

  • 时间数组长度和value数组长度需要相同,否则报错。
  • 不能和over子句一起使用。
  • 建议不要在大量数据下使用该函数,因为耗时比较长。
示例:
SELECT
    integral(array_agg(time), array_agg(value), interval '1 second')
FROM
    (VALUES ('2019-07-12 00:00:00'::timestamptz, 1),('2019-07-12 00:01:00'::timestamptz, 2),('2019-07-12 00:02:00'::timestamptz, 3)) v(time,value);

proc_add_partition

描述:TSDB用于添加分区。

参数:relationname name, boundaries_interval interval

返回值类型:void

proc_drop_partition

描述:TSDB用于删除分区。

参数:relationname name, older_than interval

返回值类型:void

add_job_class_depend

描述:增加定时任务对relation的依赖。

参数:oid, oid

返回值类型:void

分享:

    相关文档

    相关产品