文档首页 > > 开发指南> 实时数仓> 时序引擎> 使用> 时序函数

时序函数

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

时序计算函数一览表

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

功能

函数

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

time_fill()

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

fill_last()

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

time_window()

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

first()

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

last()

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

percentile_cont()

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

fill()

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

top_k()

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

bottom_k()

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

delta()

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

spread()

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,value;

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

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

表4 参数说明

参数名

类型

描述

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)

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

表5 参数说明

参数名

类型

描述

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)

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

表6 参数说明

参数名

类型

描述

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)

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

表7 参数说明

参数名

类型

描述

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)

对每个分组为空的数据进行插值补充。区别于time_fill为补充缺失时间值、fill_last只能对补充的缺失时间的其他值进行回补,fill可以对现有数据中的空值进行补充。

表8 参数说明

参数名

类型

描述

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个元组。

表9 参数说明

参数名

类型

描述

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个元组。

表10 参数说明

参数名

类型

描述

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) over(rows 1 preceding)

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

表11 参数说明

参数名

类型

描述

Required/Option

field

数值型

需要计算的列

Required

  • 该函数通常用于时序场景计算按照时间排序后相邻两行插值,用于流量,速度等指标监控。
  • 需要和窗口函数over(rows 1 preceding)联合使用,不要使用over (partition by tag rows 1 preceding) 或者与group by混合使用,否则结果可能超出预期。
示例:
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)

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

表12 参数说明

参数名

类型

描述

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);
分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问