시맨틱 뷰에서 변수 사용하기
시맨틱 뷰에서 변수 사용하기
시맨틱 뷰에서는 변수를 사용해 뷰 정의를 바꾸지 않고도 fact, dimension, metric에 수행되는 계산을 맞춤 설정할 수 있어요. fact, dimension, metric의 정의에 변수를 포함하고 기본값을 지정할 수 있으며, 시맨틱 뷰를 쿼리할 때 각 변수의 값을 지정할 수 있어요.
출처: Snowflake 문서
본문
시맨틱 뷰에서는 변수를 사용해 뷰 정의를 변경하지 않고도 fact, dimension, metric에 수행되는 계산을 맞춤 설정할 수 있어요.
fact, dimension, metric의 정의에 변수를 포함하고 기본값을 지정할 수 있어요. 시맨틱 뷰를 쿼리할 때 각 변수의 값을 지정할 수 있어요.
DDL로 변수 정의하기
시맨틱 뷰에서 변수를 정의하려면 CREATE SEMANTIC VIEW 명령에서 VARIABLES 절을 사용해요:
CREATE [ OR REPLACE ] SEMANTIC VIEW [ IF NOT EXISTS ] <name>
TABLES ( logicalTable [ , ... ] )
[ RELATIONSHIPS ( relationshipDef [ , ... ] ) ]
[ VARIABLES ( variableDef [ , ... ] ) ]
[ FACTS ( factExpression [ , ... ] ) ]
[ DIMENSIONS ( dimensionExpression [ , ... ] ) ]
[ METRICS ( { metricExpression | windowFunctionMetricExpression } [ , ... ] ) ]
...
variableDef ::=
<variable_name> [ <data_type> ]
[ { DEFAULT | := } <default_expr> ]
[ COMMENT '<description>' ]
여기서:
variable_name은 변수의 이름이에요. 이름은 식별자 규칙(identifier rules)을 따라야 해요.참고: fact, dimension, metric과 같은 이름은 사용할 수 없어요. 기본 테이블의 컬럼과 같은 이름을 사용하면, 한정되지 않은(unqualified) 참조는 변수로 해석되고 한정된(qualified) 이름은 컬럼으로 해석돼요.
data_type은 지원되는 데이터 타입 중 하나예요.default_expr은 변수의 기본값을 결정하는 지원되는 SQL 표현식이에요.description은 변수를 설명하는 주석이에요.
fact, dimension, metric의 정의에 변수를 사용할 수 있어요. 또한 시맨틱 뷰를 쿼리할 때 SEMANTIC_VIEW(...)의 WHERE 절에서도 변수를 사용할 수 있어요.
참고: UNIQUE, PRIMARY KEY, RELATIONSHIP 키 제약 조건에는 변수를 사용할 수 없어요:
CREATE SEMANTIC VIEW not_allowed TABLES (t UNIQUE (c1, my_var)) VARIABLES (my_var INT DEFAULT 1);키 제약 조건에 사용되는 계산에도 변수를 사용할 수 없어요:
CREATE SEMANTIC VIEW not_allowed TABLES(t UNIQUE (c1, calc_dim)) DIMENSIONS(t.calc_dim AS c1 + my_var) VARIABLES (my_var INT DEFAULT 1);
YAML로 변수 정의하기
변수는 시맨틱 뷰의 YAML 사양에서도 정의할 수 있어요. 최상위 variables 섹션을 추가해요:
variables:
- name: <variable_name>
data_type: <data_type>
default: <default_value>
description: <string>
예를 들어:
variables:
- name: min_amount
data_type: NUMBER
default: "1000"
description: "Minimum sale amount for HIGH category"
- name: multiplier
data_type: NUMBER
default: "1.0"
description: "Sales weight multiplier"
- name: target_region
data_type: VARCHAR
description: "Region to filter on"
이 변수들은 DDL로 정의한 변수와 마찬가지로 fact, dimension, metric의 expr 필드에서 참조할 수 있어요.
예시: 변수가 있는 시맨틱 뷰
판매 데이터가 들어 있는 테이블이 있다고 가정해 보죠:
CREATE OR REPLACE TABLE sales (
sale_id INTEGER,
amount NUMBER,
region VARCHAR,
sale_date DATE
);
INSERT INTO sales VALUES
(1, '900.00', 'East', '2025-01-01'),
(2, '1000.00', 'West', '2025-01-15'),
(3, '2000.00', 'South', '2025-01-31'),
(4, '700.00', 'North', '2025-02-01');
다음을 포함하는 시맨틱 뷰를 만들고 싶다고 가정해 보죠:
- 지정한 최소 금액에 따라
LOW또는HIGH로 설정되는sale_categorydimension. - 지정한 승수(multiplier)로 조정된 판매 금액의 합인
weighted_salesmetric.
또한 지정한 지역에 따라 region을 필터링하고 싶다고 가정해 보죠.
위 항목들에 대한 변수를 정의하는 시맨틱 뷰를 만들 수 있어요:
CREATE OR REPLACE SEMANTIC VIEW sales_analysis
TABLES (
sales PRIMARY KEY (sale_id)
)
VARIABLES (
min_amount NUMBER DEFAULT 1000,
multiplier NUMBER := 1.0,
target_region VARCHAR
)
FACTS (
sales.amount AS amount,
sales.adjusted_amount AS amount * multiplier
)
DIMENSIONS (
sales.region AS region,
sales.sale_category AS
CASE
WHEN amount >= min_amount THEN 'HIGH'
ELSE 'LOW'
END
)
METRICS (
sales.total_sales AS SUM(amount),
sales.weighted_sales AS SUM(amount * multiplier)
);
이 예시는 세 개의 변수를 정의해요:
min_amount는sale_categorydimension의 값을 결정해요. 판매 금액이 이 변수보다 같거나 크면 카테고리는HIGH예요.multiplier는weighted_salesmetric의 계산을 결정해요. 판매 금액이 더해지기 전에 이 변수가 곱해져요.target_region은 쿼리 WHERE 절에서 region별로 결과를 필터링해요. 다른 두 변수와 달리 fact, dimension, metric 정의에는 참조되지 않아요.
min_amount와 multiplier 둘 다 기본값을 가지므로, 시맨틱 뷰를 쿼리할 때 이 변수들을 설정하지 않아도 돼요. 이 예시는 기본값을 지정하는 두 가지 지원 방식을 보여줘요:
min_amount NUMBER DEFAULT 1000,
multiplier NUMBER := 1.0,
변수에 지원되는 데이터 타입
다음 데이터 타입 중 하나를 지정할 수 있어요:
- 숫자 타입(Numeric types) — NUMBER, INTEGER, FLOAT, DOUBLE 포함
- 문자열 및 이진 타입(String and binary types) — VARCHAR, STRING, TEXT, BINARY 포함
- 날짜 및 시간 타입(Date and time types) — DATE, TIME, TIMESTAMP, 그리고 TIMESTAMP 변형 포함
- 논리 타입(Logical types) — BOOLEAN 포함
- 지리공간 타입(Geospatial types) — GEOGRAPHY, GEOMETRY 포함
- 벡터 타입(Vector types) — INT와 FLOAT의 VECTOR 포함
참고: VARIANT, OBJECT, ARRAY는 지원되지 않아요.
다음 예시는 서로 다른 타입의 변수를 정의하고 일부 변수의 기본값을 설정하기 위해 함수를 호출해요:
VARIABLES (
threshold NUMBER(10,2) DEFAULT 100.50,
region_filter VARCHAR,
start_date DATE DEFAULT CURRENT_DATE(),
is_active BOOLEAN DEFAULT TRUE,
location GEOGRAPHY DEFAULT TO_GEOGRAPHY('POINT(-122.35 37.55)')
)
변수에 지원되는 표현식
변수의 값으로 다음 유형의 표현식을 지정할 수 있어요:
- 리터럴 값과 산술 표현식(arithmetic expressions) (예:
10 + 20 + 2) - 스칼라 함수 및 시스템 함수 호출 (예:
ABS(-5),UPPER('hello'),CURRENT_DATE(),UUID_STRING()) - 조건 표현식(Conditional expressions) (예:
CASE WHEN ... THEN ... END,COALESCE(),IFF()) - 데이터 타입 변환(Data type conversions) (예:
TO_NUMBER('42'),TO_VARCHAR(12345),TO_DATE('2024-01-01')) - 사용자 정의 함수(user-defined functions) 호출
시맨틱 뷰를 쿼리할 때는 바인드 변수(bind variable)나 세션 변수(session variable)를 사용할 수 있지만, 시맨틱 뷰를 정의할 때는 사용할 수 없어요. 변수의 값에는 서브쿼리를 사용할 수 없어요(시맨틱 뷰를 만들 때나 쿼리할 때 모두).
쿼리에서 변수 설정하기
시맨틱 뷰를 쿼리할 때 SEMANTIC_VIEW 표현식에서 변수 값을 설정할 수 있어요:
SEMANTIC_VIEW(
[<namespace>.]<semantic_view_name>
[
{
METRICS <metric_expr> [ [ AS ] <alias> ] [ , ... ] |
FACTS <fact_expr> [ , ... ]
}
]
[ DIMENSIONS <dimension_expr> [ [ AS ] <alias> ] [ , ... ] ]
[ WHERE <predicate> ]
[ VARIABLES <variable> { = | => } <value> [ , ... ] ]
)
변수 이름과 값 사이에 = 또는 =>를 사용할 수 있어요. 두 연산자는 동일해요.
예를 들어 앞서 정의한 시맨틱 뷰를 쿼리하려면:
SELECT * FROM SEMANTIC_VIEW(
sales_analysis
DIMENSIONS region, sale_category
METRICS weighted_sales
WHERE region = target_region
VARIABLES min_amount = 2000,
target_region => 'West',
multiplier = 1.5
);
+--------+---------------+----------------+
| REGION | SALE_CATEGORY | WEIGHTED_SALES |
|--------+---------------+----------------|
| West | LOW | 1500.0 |
+--------+---------------+----------------+
이 예시는 min_amount와 multiplier 변수의 기본값을 덮어씁니다. 또한 target_region 변수를 설정하고 쿼리 WHERE 절에서 이 변수를 사용해요.
참고: 기본값이 없는 변수를 정의하고 쿼리에서 그 변수를 설정하지 않으면 쿼리가 실패해요.
제약 사항(Limitations)
현재 변수에는 다음과 같은 제약 사항이 있어요:
- SHOW VARIABLES 명령은 시맨틱 뷰의 변수를 반환하지 않아요.
- 변수는 윈도우 함수 프레임 경계(window function frame bounds)에 사용할 수 없어요.