暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据查询

由迪 2024-06-25
70

Uqbar使用SQL作为查询语言,用户可以通过客户端或者不同的驱动连接到Uqbar执行数据查询。为支持用户不同的数据分析需求,Uqbar提供了丰富的查询算子。

  • 聚合类算子

  • 选择类算子

  • 转换类算子

  • Join查询

  • LATERAL关键字

  • 索引

    聚合类算子

    当前版本的Uqbar支持以下常用聚合算子:

    聚合函数 用途 参考链接
    count 统计数量 聚集函数 | MogDB Docs
    distinct 去重 聚集函数 | MogDB Docs
    avg 平均值 聚集函数 | MogDB Docs
    median 求中位数 聚集函数 | MogDB Docs
    mode() within group 求最大频次数 聚集函数 | MogDB Docs
    stddev 求标准差 聚集函数 | MogDB Docs
    sum 求和 聚集函数 | MogDB Docs
    time_bucket 时间对齐 time_bucket
    time_bucket_gapfill 对数据缺失的时间段进行填值 time_bucket_gapfill
    sum…over… 累积和 Session性能诊断 | MogDB Docs
    avg…over 移动平均 高级分析函数支持 | MogDB Docs
    histogram 分析时间序列数据的分布情况 histogram
    difference 计算与上一值的差值 difference
    derivative 计算相邻的两行值的变化率 derivative
    percentile 返回数据排序后位于第N个百分位数的值 percentile

    选择类算子

    Uqbar当前版本支持以下常用选择类算子:

    函数 用途 参考链接
    first 取最早的值 first() / last()
    last 取最晚的值 first() / last()
    max 取最大的值 聚集函数 | MogDB Docs
    min 取最小的值 聚集函数 | MogDB Docs

    转换类算子

    当前版本的Uqbar支持以下常用转换算子:

    函数 用途 参考链接
    ABS 求绝对值 数字操作函数和操作符 | MogDB Docs
    ACOS 三角函数 数字操作函数和操作符 | MogDB Docs
    ASIN 三角函数 数字操作函数和操作符 | MogDB Docs
    ATAN 三角函数 数字操作函数和操作符 | MogDB Docs
    ATAN2 三角函数 数字操作函数和操作符 | MogDB Docs
    CEIL 向上取整 数字操作函数和操作符 | MogDB Docs
    COS 三角函数 数字操作函数和操作符 | MogDB Docs
    EXP 求指数 数字操作函数和操作符 | MogDB Docs
    FLOOR 向下取整 数字操作函数和操作符 | MogDB Docs
    LN 对数函数 数字操作函数和操作符 | MogDB Docs
    LOG 对数函数 数字操作函数和操作符 | MogDB Docs
    POW 乘方运算 数字操作函数和操作符 | MogDB Docs
    ROUND 四舍五入运算 数字操作函数和操作符 | MogDB Docs
    SIN 三角函数 数字操作函数和操作符 | MogDB Docs
    SQRT 求平方根 数字操作函数和操作符 | MogDB Docs
    TAN 三角函数 数字操作函数和操作符 | MogDB Docs
    COT 三角函数 数字操作函数和操作符 | MogDB Docs

    Join查询

    支持时序表与关系表、时序表与时序表之间join查询。

    解释Uqbar=# CREATE TABLE cpu_info (id int, arch text, cores int, speed float); Uqbar=# INSERT INTO cpu_info VALUES (1, 'aarch64', 8, 2000); Uqbar=# INSERT INTO cpu_info VALUES (2, 'x86_64', 8, 2200); Uqbar=# INSERT INTO cpu_info VALUES (3, 'aarch64', 16, 2000); Uqbar=# INSERT INTO cpu_info VALUES (4, 'x86_64', 16, 2200); Uqbar=# DROP TIMESERIES TABLE IF EXISTS cpu; Uqbar=# CREATE TIMESERIES TABLE cpu(time timestamp tstime, tags_id int tstag, usage float); Uqbar=# INSERT INTO cpu VALUES ('2023-05-01 00:00:00', 1, 82); Uqbar=# INSERT INTO cpu VALUES ('2023-05-01 12:00:00', 1, 83); Uqbar=# INSERT INTO cpu VALUES ('2023-05-01 23:59:59', 1, 84); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 00:00:00', 1, 92); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 12:00:00', 1, 93); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 23:59:59', 1, 94); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 00:00:00', 2, 84); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 12:00:00', 2, 85); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 23:59:59', 2, 86); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 00:00:00', 3, 93); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 00:00:00', 3, 92); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 00:00:00', 3, 91); Uqbar=# INSERT INTO cpu VALUES ('2023-05-02 00:00:00', 5, 91); Uqbar=# SELECT cpu.time, cpu_info.arch, cpu_info.id, cpu_info.cores, cpu_info.speed FROM cpu LEFT JOIN cpu_info ON cpu.tags_id = cpu_info.id ORDER BY cpu.tags_id,cpu.time ASC; time | arch | id | cores | speed ---------------------+---------+----+-------+------- 2023-05-01 00:00:00 | aarch64 | 1 | 8 | 2000 2023-05-01 12:00:00 | aarch64 | 1 | 8 | 2000 2023-05-01 23:59:59 | aarch64 | 1 | 8 | 2000 2023-05-02 00:00:00 | aarch64 | 1 | 8 | 2000 2023-05-02 12:00:00 | aarch64 | 1 | 8 | 2000 2023-05-02 23:59:59 | aarch64 | 1 | 8 | 2000 2023-05-02 00:00:00 | x86_64 | 2 | 8 | 2200 2023-05-02 12:00:00 | x86_64 | 2 | 8 | 2200 2023-05-02 23:59:59 | x86_64 | 2 | 8 | 2200 2023-05-02 00:00:00 | aarch64 | 3 | 16 | 2000 2023-05-02 00:00:00 | aarch64 | 3 | 16 | 2000 2023-05-02 00:00:00 | aarch64 | 3 | 16 | 2000 2023-05-02 00:00:00 | | | | (13 rows) Uqbar=# SELECT time_bucket('1 day',time) as bucket, cpu_info.id, avg(usage) FROM cpu LEFT JOIN cpu_info ON cpu.tags_id = cpu_info.id GROUP BY bucket,cpu_info.id ORDER BY cpu_info.id,bucket ASC; bucket | id | avg ---------------------+----+----- 2023-05-01 00:00:00 | 1 | 83 2023-05-02 00:00:00 | 1 | 93 2023-05-02 00:00:00 | 2 | 85 2023-05-02 00:00:00 | 3 | 92 2023-05-02 00:00:00 | | 91 (5 rows)

    LATERAL关键字

    LATERAL 关键字用于在查询中引用先前表达式的结果。它可以与子查询或函数一起使用,并允许在查询中使用先前的表达式结果作为后续表达式的输入。

    LATERAL关键字的作用:

    • 依赖关联子查询:使用LATERAL关键字,可以在查询中引用先前的表达式,从而创建依赖关联的子查询。即可以在子查询中访问先前的表达式的结果,并在查询中使用该结果作为后续表达式的输入。
    • 动态列计算:LATERAL关键字可以用于动态计算列的值。例如,在查询中使用LATERAL来计算每行的列值,这些列的计算依赖于先前的表达式结果或其他表中的数据。
    • 减少查询次数:通过使用LATERAL关键字可以避免多次执行重复的子查询。子查询可以引用外部查询的表达式结果,从而在查询执行过程中减少查询次数,提高性能。
    解释Uqbar=# CREATE TABLE t_product AS SELECT id AS product_id, id * 10 * random() AS price, 'product ' || id AS product FROM generate_series(1, 1000) AS id; Uqbar=# CREATE TABLE t_wishlist ( wishlist_id int, username text, desired_price numeric ); Uqbar=# INSERT INTO t_wishlist VALUES (1, 'hans', '450'), (2, 'joe', '60'), (3, 'jane', '1500'); Uqbar=# SELECT * FROM t_wishlist AS w, LATERAL (SELECT * FROM t_product AS p WHERE p.price < w.desired_price ORDER BY p.price DESC LIMIT 3 ) AS x ORDER BY wishlist_id, price DESC;Uqbar-# Uqbar-# Uqbar(# Uqbar(# Uqbar(# Uqbar(# Uqbar(# Uqbar-# wishlist_id | username | desired_price | product_id | price | product -------------+----------+---------------+------------+------------------+------------- 1 | hans | 450 | 268 | 447.912638001144 | product 268 1 | hans | 450 | 445 | 440.73279609438 | product 445 1 | hans | 450 | 90 | 436.825405899435 | product 90 2 | joe | 60 | 122 | 57.7194433659315 | product 122 2 | joe | 60 | 50 | 55.5128382984549 | product 50 2 | joe | 60 | 9 | 55.1704007294029 | product 9 3 | jane | 1500 | 168 | 1498.51569615304 | product 168 3 | jane | 1500 | 774 | 1496.66411731392 | product 774 3 | jane | 1500 | 420 | 1494.14442060515 | product 420 (9 rows)

索引

在时序表上支持索引相关功能,以便用户根据实际需求使用索引提升查询性能。时序表上支持的索引类型包括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 ];

修改索引

  • 重命名表索引的名称

    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;

删除索引

DROP INDEX [ CONCURRENTLY ] [ IF EXISTS ] index_name [, ...] [ CASCADE | RESTRICT ];

重建索引

REINDEX { INDEX| [INTERNAL] TABLE} name PARTITION partition_name [ FORCE ];
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论