Query Semantic View
Use the semantic_view() table function to query semantic views. The engine automatically handles table joins and aggregations based on foreign key definitions, eliminating the need to manually write JOIN and GROUP BY.
Syntax
SELECT *
FROM semantic_view(
<view_name>,
[ DIMENSIONS <dimension_name> [ , DIMENSIONS <dimension_name> ... ] ]
[ METRICS <metric_name> [ , METRICS <metric_name> ... ] ]
);
Dimension and metric names support two forms:
- Qualified name:
<logical_table_alias>.<name>, e.g., emps.department
- Short name: Use the name directly, e.g.,
department (usable when the name is unique within the view)
Usage Notes
- At least one
DIMENSIONS or METRICS parameter must be specified, otherwise an error is reported.
- Passing only
DIMENSIONS without METRICS: returns a deduplicated list of dimension values.
- Passing only
METRICS without DIMENSIONS: returns a global aggregation result (one row).
- Query results are automatically grouped by the specified dimensions, with dimension order matching the order specified in the query.
- Outer
WHERE, ORDER BY, and LIMIT clauses are supported.
- Use
SELECT col1, col2 FROM semantic_view(...) to select specific columns; SELECT * is not required.
Examples
The following examples are based on the doc_test.emp_dept_analysis semantic view (defined in Create Semantic View).
Group Metrics by Dimension
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 |
+-------------+-----------------+--------------+
Cross-table Dimension (Auto JOIN)
Dimensions from foreign key relationships can be used directly; the engine automatically handles 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 |
+--------------+-----------------+--------------+
Using Short Names
When names are unique within the view, the logical table alias prefix can be omitted:
SELECT * FROM semantic_view(
doc_test.emp_dept_analysis,
DIMENSIONS department,
METRICS total_employees
);
WHERE Filtering
Define the column to filter as a dimension, then filter via the outer WHERE clause:
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 Only, Returning Global Aggregation
SELECT * FROM semantic_view(
doc_test.emp_dept_analysis,
METRICS emps.total_employees,
METRICS emps.avg_salary
);
+-----------------+--------------+
| total_employees | avg_salary |
+-----------------+--------------+
| 5 | 9600.000000 |
+-----------------+--------------+
Computed Dimension Query
Computed dimensions (e.g., YEAR expressions) return integer types:
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 |
+-----------+-----------------+
Multi-dimension Combination
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;
Comparison with Traditional SQL
The same analysis requirement, comparing traditional SQL with semantic view syntax:
Traditional SQL (requires manual JOIN and 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;
Semantic View (automatically handles JOIN and aggregation):
SELECT * FROM semantic_view(
doc_test.emp_dept_analysis,
DIMENSIONS emps.department,
DIMENSIONS depts.manager_name,
METRICS emps.total_employees,
METRICS emps.avg_salary
);