Advanced Query Usage

The query result from semantic_view() is a standard relational result set and can be used like a regular table in subqueries, CTEs, JOINs, and CTAS.

The following examples are based on doc_test.emp_dept_analysis (defined in Create Semantic View).

Subqueries

Semantic views can serve as the data source for subqueries, with the outer query able to further filter or process the results:

SELECT dept, avg_sal FROM ( SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, METRICS emps.avg_salary ) ) t WHERE avg_salary > 9000;

+-------------+--------------+ | dept | avg_sal | +-------------+--------------+ | Engineering | 11500.000000 | +-------------+--------------+

CTE (WITH Clause)

Semantic views can be placed in CTEs for easy reuse within the same query:

WITH dept_stats AS ( SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, METRICS emps.avg_salary, METRICS emps.total_employees ) ) SELECT * FROM dept_stats WHERE total_employees > 1 ORDER BY avg_salary DESC;

+-------------+--------------+-----------------+ | department | avg_salary | total_employees | +-------------+--------------+-----------------+ | Engineering | 11500.000000 | 2 | | Marketing | 8750.000000 | 2 | +-------------+--------------+-----------------+

JOIN with Regular Tables

Semantic view results can be further joined with regular tables:

SELECT sv.department, sv.avg_salary, d.manager FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, METRICS emps.avg_salary ) sv JOIN doc_test.departments d ON sv.department = d.dept_name;

+-------------+--------------+---------+ | department | avg_salary | manager | +-------------+--------------+---------+ | Engineering | 11500.000000 | Frank | | Marketing | 8750.000000 | Grace | | HR | 7500.000000 | Henry | +-------------+--------------+---------+

CTAS (CREATE TABLE AS SELECT)

Semantic view query results can be materialized into regular tables for further processing or export:

CREATE TABLE doc_test.dept_salary_snapshot AS SELECT * FROM semantic_view( doc_test.emp_dept_analysis, DIMENSIONS emps.department, METRICS emps.total_employees, METRICS emps.avg_salary, METRICS emps.max_salary );

INSERT INTO ... SELECT

Similarly, you can write semantic view query results into an existing table:

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

Notes

  • Column names in subqueries come from the result columns of semantic_view() (i.e., dimension names and metric names), not from the original physical table column names.
  • CTAS and INSERT INTO create materialized snapshots that do not automatically refresh when the underlying data of the semantic view changes. For automatic refresh, define it as a Dynamic Table: CREATE DYNAMIC TABLE ... AS SELECT * FROM semantic_view(...).