시맨틱 뷰에서 변수 사용하기

시맨틱 뷰에서 변수 사용하기

시맨틱 뷰에서는 변수를 사용해 뷰 정의를 바꾸지 않고도 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_category dimension.
  • 지정한 승수(multiplier)로 조정된 판매 금액의 합인 weighted_sales metric.

또한 지정한 지역에 따라 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_category dimension의 값을 결정해요. 판매 금액이 이 변수보다 같거나 크면 카테고리는 HIGH예요.
  • multiplier는 weighted_sales metric의 계산을 결정해요. 판매 금액이 더해지기 전에 이 변수가 곱해져요.
  • target_region은 쿼리 WHERE 절에서 region별로 결과를 필터링해요. 다른 두 변수와 달리 fact, dimension, metric 정의에는 참조되지 않아요.

min_amount와 multiplier 둘 다 기본값을 가지므로, 시맨틱 뷰를 쿼리할 때 이 변수들을 설정하지 않아도 돼요. 이 예시는 기본값을 지정하는 두 가지 지원 방식을 보여줘요:

min_amount NUMBER DEFAULT 1000,
multiplier NUMBER := 1.0,

변수에 지원되는 데이터 타입

다음 데이터 타입 중 하나를 지정할 수 있어요:

참고: 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)')
)

변수에 지원되는 표현식

변수의 값으로 다음 유형의 표현식을 지정할 수 있어요:

시맨틱 뷰를 쿼리할 때는 바인드 변수(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)에 사용할 수 없어요.

더 알아보기 (Learn more)