查询语义视图
使用
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
);
相关文档