查询语义视图

使用

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

语法

semantic_view( <视图名称> [ DIMENSIONS <项> [ , <项> ... ] ] [ METRICS <项> [ , <项> ... ] ] [ FACTS <项> [ , <项> ... ] ] [ WHERE <谓词> ] [ VARIABLES <名> => <值> [ , ... ] ] )

维度、指标、事实名称支持两种形式:

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

DIMENSIONS
DIMENSIONS
、
METRICS
METRICS
、
FACTS
FACTS
三个子句与顺序无关(
METRICS ... DIMENSIONS ...
METRICS ... DIMENSIONS ...
与
DIMENSIONS ... METRICS ...
DIMENSIONS ... METRICS ...
效果相同),输出列按项书写的顺序排列。
WHERE
WHERE
与
VARIABLES
VARIABLES
是结尾子句,必须排在三个子句关键字之后,且
WHERE
WHERE
在
VARIABLES
VARIABLES
之前。

FACTS
FACTS
用于选取视图
FACTS
FACTS
子句里直接定义的组合聚合事实;如果事实只是把子表列透传给某个
METRICS
METRICS
指标引用,则查询该指标时用
METRICS
METRICS
(见下方"查询 FACTS 事实")。

使用说明

  • 必须至少指定一个
    DIMENSIONS
    DIMENSIONS
    、
    METRICS
    METRICS
    或
    FACTS
    FACTS
    参数,否则报错。
  • 只传
    DIMENSIONS
    DIMENSIONS
    不传
    METRICS
    METRICS
    :返回去重后的维度值列表。
  • 只传
    METRICS
    METRICS
    不传
    DIMENSIONS
    DIMENSIONS
    :返回全局聚合结果(一行)。
  • 查询结果按指定维度自动分组,维度顺序与查询中指定的顺序一致。
  • 过滤维度可用内部
    WHERE
    WHERE
    (结尾子句),也可在
    semantic_view()
    semantic_view()
    外层用
    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, emps.avg_salary ) ORDER BY department;

+-------------+-----------------+----------------+ | department | total_employees | avg_salary | +-------------+-----------------+----------------+ | Engineering | 2 | 115000.000000 | | HR | 1 | 80000.000000 | | Marketing | 2 | 92500.000000 | +-------------+-----------------+----------------+

跨表维度(自动 JOIN)

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

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

+--------------+-----------------+----------------+ | manager_name | total_employees | avg_salary | +--------------+-----------------+----------------+ | Alice | 2 | 115000.000000 | | Bob | 2 | 92500.000000 | | Carol | 1 | 80000.000000 | +--------------+-----------------+----------------+

使用短名称

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

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

+-------------+-----------------+ | department | total_employees | +-------------+-----------------+ | Engineering | 2 | | HR | 1 | | Marketing | 2 | +-------------+-----------------+

WHERE 过滤

将需要过滤的列定义为维度后,用

WHERE
WHERE
过滤。
WHERE
WHERE
可以写在
semantic_view()
semantic_view()
内部(作为结尾子句,排在
DIMENSIONS
DIMENSIONS
/
METRICS
METRICS
/
FACTS
FACTS
之后),此处维度限定名或短名均可:

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

+-------------+--------------+ | department | avg_salary | +-------------+--------------+ | Engineering | 115000.000000 | +-------------+--------------+

也可以写在

semantic_view()
semantic_view()
外层,结果相同。但外层
WHERE
WHERE
引用的是
semantic_view()
semantic_view()
输出列,只能用维度短名(写
emps.department
emps.department
会报
cannot resolve column 'emps.department'
cannot resolve column 'emps.department'
):

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

只传 METRICS,返回全局聚合

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

+-----------------+---------------+ | total_employees | avg_salary | +-----------------+---------------+ | 5 | 99000.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, emps.hire_year METRICS emps.total_employees ) ORDER BY department, hire_year;

+-------------+-----------+-----------------+ | department | hire_year | total_employees | +-------------+-----------+-----------------+ | Engineering | 2019 | 1 | | Engineering | 2020 | 1 | | HR | 2023 | 1 | | Marketing | 2021 | 1 | | Marketing | 2022 | 1 | +-------------+-----------+-----------------+

查询 FACTS 事实

当视图定义了

FACTS
FACTS
子句时,指标可以引用透传的事实。以下基于
doc_test.sv_facts
doc_test.sv_facts
(定义见创建语义视图的"带 FACTS 的语义视图"),
order_count
order_count
是引用了透传事实
orders.order_id
orders.order_id
的指标,查询时按普通指标用
METRICS
METRICS
选取:

SELECT * FROM semantic_view( doc_test.sv_facts DIMENSIONS customer.cust_name METRICS customer.order_count ) ORDER BY cust_name;

+-----------+-------------+ | cust_name | order_count | +-----------+-------------+ | Alice | 2 | | Bob | 1 | +-----------+-------------+

查询时绑定 VARIABLES

如果视图声明了

VARIABLES
VARIABLES
(查询参数,定义见创建语义视图的"带查询参数的语义视图"),可以在查询末尾用
VARIABLES
VARIABLES
子句为本次查询绑定值,覆盖声明时的默认值。以下基于
doc_test.sv_variables
doc_test.sv_variables
,它有一个阈值参数
min_amount
min_amount
(默认 1000)用于把销售额划分成 HIGH / LOW。

不绑定,使用默认值

min_amount = 1000
min_amount = 1000
:

SELECT * FROM semantic_view( doc_test.sv_variables DIMENSIONS sale_category METRICS total_sales ) ORDER BY sale_category;

+---------------+-------------+ | sale_category | total_sales | +---------------+-------------+ | HIGH | 4000.00 | | LOW | 500.00 | +---------------+-------------+

只为本次查询覆盖阈值为 2000(

=>
=>
或
=
=
均可):

SELECT * FROM semantic_view( doc_test.sv_variables DIMENSIONS sale_category METRICS total_sales VARIABLES min_amount => 2000.00 ) ORDER BY sale_category;

+---------------+-------------+ | sale_category | total_sales | +---------------+-------------+ | HIGH | 2500.00 | | LOW | 2000.00 | +---------------+-------------+

绑定值必须是常量。

VARIABLES
VARIABLES
是查询里的最后一个子句,排在
WHERE
WHERE
之后。声明时没有默认值的变量,只要被维度/指标引用就必须在查询时绑定,否则报错。

与传统 SQL 对比

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

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

SELECT e.dept, d.manager AS manager_name, 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, depts.manager_name METRICS emps.total_employees, emps.avg_salary );

相关文档

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