数据查询
Uqbar使用SQL作为查询语言,用户可以通过客户端或者不同的驱动连接到Uqbar执行数据查询。为支持用户不同的数据分析需求,Uqbar提供了丰富的查询算子。
聚合类算子
当前版本的Uqbar支持以下常用聚合算子:
聚合函数 | 用途 |
---|---|
COUNT | 统计数量 |
DISTINCT | 去重 |
AVG | 平均值 |
MEDIAN | 求中位数 |
MODE() WITHIN GROUP | 求最大频次数 |
STDDEV | 求标准差 |
SUM | 求和 |
TIME_BUCKET | 时间对齐 |
SUM...OVER... | 累积和 |
AVG...OVER | 移动平均 |
time_bucket()
time_bucket时间范围对齐函数,用于将一个时间按照bucket_width对齐到一个时间点,方便后续对时间聚合。
语法
time_bucket(bucket_width, time,[offset | origin])
参数说明
参数名 | 类型 | 属性 | 释义 |
---|---|---|---|
bucket_width | TEXT | 必选 | 对齐的时间间隔。只能使用'正整数+时间标识'的方式,时间标识包括interval类型支持的所有单位,包括'microsecond,millisecond,second,minute,hour,day,week,month,year,decade,century,millennium' 及这些单位的复数形式,如years、months、days等和简写形式,如y、m、d等。 |
time | TIMESTAMP | 必选 | 需要对齐的时间。 |
offset | INTERVAL | 可选 | 使用这个值调整对齐窗口位置,如果是正值,时间窗口整体向将来移动,如果是负值,窗口位置向过去移动。相当于将默认的origin移动offset的位置。 |
origin | TIMESTAMP | 可选 | 对齐的base,默认从’2001-1-1 00:00:00’对齐;此参数与offset互斥。 |
约束
使用time_bucket时,由于offset与origin是互斥的参数,所以time_bucket的第三个参数可能是offset(interval 类型),也可能是origin(timestamp 类型)。为了方便区分是offset还是origin使用时,如果使用offset或者origin需要显式指定第三个参数的类型,如:
select time_bucket('5minute',time,'2001-1-1 00:00:00'::timestamp) as bucket ,count(temperature) from weather group by bucket order by bucket asc;
或者
select time_bucket('1minute',time,'1minute'::interval) as bucket ,count(temperature) from weather group by bucket order by bucket asc;
示例
Uqbar=# select * from t1 order by time;
time | id | value
------------------------+----+-------
2022-06-02 00:01:00+08 | 1 | 9
2022-06-02 00:04:00+08 | 1 | 11
2022-06-02 00:06:00+08 | 1 | 10
2022-06-02 00:07:00+08 | 1 | 11
2022-06-02 00:15:00+08 | 1 | 12
(5 rows)
Uqbar=# select time_bucket('2 minute',time) as bucket, sum(value) from t1 group by bucket order by bucket;
bucket | sum
------------------------------------+-----
2022-06-02 00:00:00+08 | 9
2022-06-02 00:04:00+08 | 11
2022-06-02 00:06:00+08 | 21
2022-06-02 00:14:00+08 | 12
(4 rows)
选择类算子
当前版本的Uqbar支持以下常用选择算子:
函数 | 用途 |
---|---|
FIRST | 取最早的值 |
LAST | 取最晚的值 |
MAX | 取最大的值 |
MIN | 取最小的值 |
PERCENTILE | 计算百分位值 |
SAMPLE | 返回N个抽样 |
TOP | 取最大的N个值 |
first() / last()
使用cmp_col列做比较,返回时间最早或最晚的value指定的列的值。时序的first/last算子在timeseries_catalog这个schema下,区别于public中的first/last。
语法
select city_name,timeseries_catalog.first(temp_c,time) from weather_metrics group by city_name;
select city_name,timeseries_catalog.last(temp_c,time) from weather_metrics group by city_name;
timeseries_catalog.first(value, cmp_col)
timeseries_catalog.last(value, cmp_col)
参数说明
参数名 | 类型 | 属性 | 释义 |
---|---|---|---|
value | ANY | 必选 | 返回值 |
cmp_col | TIMESTAMP or TIMESTAMPTZ | 必选 | 比较值 |
约束
当表存在多条记录的cmp_col列最小值/最大值相同时,返回这些记录中第一条/最后一条的value。
当cmp_col列为常量时,时序first/last算子的效果等同于public中的first/last算子, 返回所有记录中的第一条/最后一条的value值。
示例
Uqbar=# select city_name,timeseries_catalog.first(temp_c,time) from weather_metrics group by city_name;
city_name | first
---------------+-------
beijing | 30
shanghai | 29
(2 row)
转换类算子
当前版本的Uqbar支持以下常用转换算子:
函数 | 用途 |
---|---|
ABS | 求绝对值 |
ACOS | 三角函数 |
ASIN | 三角函数 |
ATAN | 三角函数 |
ATAN2 | 三角函数 |
CEIL | 向上取整 |
COS | 三角函数 |
EXP | 求指数 |
FLOOR | 向下取整 |
LN | 对数函数 |
LOG | 对数函数 |
POW | 乘方运算 |
ROUND | 四舍五入运算 |
SIN | 三角函数 |
SQRT | 求平方根 |
TAN | 三角函数 |
COT | 三角函数 |
Join查询
支持时序表与关系表、时序表与时序表之间join查询。
索引
在时序表上支持索引相关功能,以便用户根据实际需求使用索引提升查询性能。时序表上支持的索引类型包括Btree和Gin,不支持创建部分索引,Btree可以支持唯一索引。时序表上索引默认是LOCAL索引,不支持创建GLOBAL索引。在时序表执行数据删除时,对应分区上的索引也会一起删除。
创建索引
语法和分区表创建索引语法基本相同,但不支持创建GLOBAL索引。
CREATE [ UNIQUE ] INDEX [ [schema_name.]index_name ] ON table_name [ USING method ]
( {{ column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [ ASC | DESC ] [ NULLS LAST ] }[, ...] )
[ LOCAL [ ( { PARTITION index_partition_name | SUBPARTITION index_subpartition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] ]
[ INCLUDE ( column_name [, ...] )]
[ WITH ( { storage_parameter = value } [, ...] ) ]
[ TABLESPACE tablespace_name ];
删除索引
DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] index_name [, ...] [ CASCADE | RESTRICT ];
修改索引
-
重命名表索引的名称
ALTER INDEX [ IF EXISTS ] index_name RENAME TO new_name;
-
修改表索引的存储参数
ALTER INDEX [ IF EXISTS ] index_name SET ( {storage_parameter = value} [, ... ] );
-
设置表索引或索引分区不可用
ALTER INDEX [ IF EXISTS ] index_name [ MODIFY PARTITION index_partition_name ] UNUSABLE;
-
重置索引的一个或多个索引方法特定的存储参数为缺省值。与SET一样,可能需要使用REINDEX来完全更新索引。
ALTER INDEX [ IF EXISTS ] index_name RESET ( { storage_parameter } [, …] );
-
重建表或者索引分区上的索引。
ALTER INDEX [ IF EXISTS ] index_name REBUILD [ PARTITION index_partition_name ];
-
重命名索引分区
ALTER INDEX [ IF EXISTS ] index_name RENAME PARTITION index_partition_name TO new_index_partition_name;
-
修改索引分区的所属表空间
ALTER INDEX [ IF EXISTS ] index_name MOVE PARTITION index_partition_name TABLESPACE new_tablespace;
重建索引
REINDEX { INDEX| [INTERNAL] TABLE} name PARTITION partition_name [ FORCE ];