查询语义视图

使用

semantic_view()
semantic_view()
表函数查询语义视图,引擎自动根据外键定义处理表连接和聚合,无需手写 JOIN 和 GROUP BY。

语法

SELECT * FROM semantic_view( <视图名称>, [ DIMENSIONS <维度名> [ , DIMENSIONS <维度名> ... ] ] [ METRICS <指标名> [ , METRICS <指标名> ... ] ] );

维度和指标名称支持两种形式:

  • 限定名称
    <逻辑表别名>.<名称>
    <逻辑表别名>.<名称>
    ,如
    emps.department
    emps.department
  • 短名称:直接使用名称,如
    department
    department
    (名称在视图内唯一时可用)

使用说明

  • 必须至少指定一个
    DIMENSIONS
    DIMENSIONS
    METRICS
    METRICS
    参数,否则报错。
  • 只传
    DIMENSIONS
    DIMENSIONS
    不传
    METRICS
    METRICS
    :返回去重后的维度值列表。
  • 只传
    METRICS
    METRICS
    不传
    DIMENSIONS
    DIMENSIONS
    :返回全局聚合结果(一行)。
  • 查询结果按指定维度自动分组,维度顺序与查询中指定的顺序一致。
  • 支持在外层加
    WHERE
    WHERE
    ORDER BY
    ORDER BY
    LIMIT
    LIMIT
    子句。
  • 支持
    SELECT col1, col2 FROM semantic_view(...)
    SELECT col1, col2 FROM semantic_view(...)
    选取部分列,不必用
    SELECT *
    SELECT *

示例

以下示例基于

doc_test.emp_dept_analysis
doc_test.emp_dept_analysis
语义视图(定义见创建语义视图)。

按维度分组统计指标

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, METRICS emps.total_employees, METRICS emps.avg_salary );

+-------------+-----------------+--------------+ | department | total_employees | avg_salary | +-------------+-----------------+--------------+ | Engineering | 2 | 11500.000000 | | Marketing | 2 | 8750.000000 | | HR | 1 | 7500.000000 | +-------------+-----------------+--------------+

跨表维度(自动 JOIN)

外键关联的维度可以直接使用,引擎自动处理 JOIN:

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS depts.manager_name, METRICS emps.total_employees, METRICS emps.avg_salary );

+--------------+-----------------+--------------+ | manager_name | total_employees | avg_salary | +--------------+-----------------+--------------+ | Frank | 2 | 11500.000000 | | Henry | 1 | 7500.000000 | | Grace | 2 | 8750.000000 | +--------------+-----------------+--------------+

使用短名称

名称在视图内唯一时,可省略逻辑表别名前缀:

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS department, METRICS total_employees );

WHERE 过滤

将需要过滤的列定义为维度后,通过外层

WHERE
WHERE
子句过滤:

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, METRICS emps.avg_salary ) WHERE department = 'Engineering';

+-------------+--------------+ | department | avg_salary | +-------------+--------------+ | Engineering | 11500.000000 | +-------------+--------------+

只传 METRICS,返回全局聚合

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, METRICS emps.total_employees, METRICS emps.avg_salary );

+-----------------+--------------+ | total_employees | avg_salary | +-----------------+--------------+ | 5 | 9600.000000 | +-----------------+--------------+

计算维度查询

计算维度(如

YEAR
YEAR
表达式)返回整数类型:

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.hire_year, METRICS emps.total_employees ) ORDER BY hire_year;

+-----------+-----------------+ | hire_year | total_employees | +-----------+-----------------+ | 2019 | 1 | | 2020 | 1 | | 2021 | 1 | | 2022 | 1 | | 2023 | 1 | +-----------+-----------------+

多维度组合

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, DIMENSIONS emps.hire_year, METRICS emps.total_employees ) ORDER BY department, hire_year;

与传统 SQL 对比

同一分析需求,传统 SQL 与语义视图的写法对比:

传统 SQL(需手写 JOIN 和 GROUP BY):

SELECT e.dept, d.manager, COUNT(e.id) AS total_employees, AVG(e.salary) AS avg_salary FROM doc_test.employees e JOIN doc_test.departments d ON e.dept = d.dept_name GROUP BY e.dept, d.manager;

语义视图(自动处理 JOIN 和聚合):

SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, DIMENSIONS depts.manager_name, METRICS emps.total_employees, METRICS emps.avg_salary );

相关文档

联系我们
预约咨询
微信咨询
电话咨询