테이블(Table) 함수

테이블(Table) 함수

테이블 함수는 각 입력 행에 대해 행 집합을 반환합니다. 반환되는 집합은 0개, 1개 또는 여러 행이 될 수 있습니다. 각 행은 하나 이상의 컬럼을 포함할 수 있습니다.

테이블 함수는 "tabular functions"라고도 불립니다.

출처: Snowflake SQL Reference

본문

테이블 함수란 무엇인가?

테이블 함수는 함수가 개별 입력마다 여러 행을 반환할 때 주로 사용됩니다.

테이블 함수가 호출될 때마다 반환되는 행 수가 달라질 수 있습니다. 예를 들어 지정된 날짜의 기록상 최고 기온 목록을 반환하는 record_high_temperatures_for_date() 함수는 4월 10일에는 0행, 6월 10일에는 1행, 8월 20일에는 40행을 반환할 수 있습니다.

테이블 함수의 간단한 예

다음과 같은 함수는 테이블 함수로 적합합니다.

  • 계좌 번호와 날짜를 받아 그 날짜에 그 계좌에 청구된 모든 요금을 반환하는 함수.(특정 날짜에 둘 이상의 요금이 청구되었을 수 있습니다.)
  • 사용자 ID를 받아 그 사용자에게 할당된 데이터베이스 역할을 반환하는 함수.(사용자는 "sysadmin"과 "useradmin"을 포함해 여러 역할을 가질 수 있습니다.)

각 출력 행이 여러 입력 행에 의존하는 함수

테이블 함수는 각 출력 행에 영향을 주는 입력 행 수에 따라 두 범주로 나눌 수 있습니다.

  • 1-to-N
  • M-to-N

앞에서 설명한 함수들은 1-to-N 테이블 함수입니다. 각 출력 행은 단 하나의 입력 행에만 의존합니다. 예를 들어 record_high_temperatures_for_date() 함수는 여러 출력 행(그 날짜에 기록을 세운 각 도시별로 하나씩)을 만들 수 있습니다. 특정 입력 날짜에 대한 각 출력 행은 그 날짜에만 의존합니다. 각 출력 행은 다른 모든 날짜의 행과 독립적입니다.

Snowflake는 M-to-N 테이블 함수도 지원합니다. 각 출력 행은 여러 입력 행에 의존할 수 있습니다. 예를 들어 함수가 주가의 이동 평균을 생성한다면, 그 함수는 각 출력 행을 만들기 위해 여러 입력 행(여러 날짜)의 주가를 사용합니다.

더 일반적으로, M-to-N 함수에서는 M개의 입력 행 그룹이 N개의 출력 행 그룹을 만듭니다. M은 한 개 이상의 행이 될 수 있습니다. N은 0개, 한 개 또는 여러 행이 될 수 있습니다.

예를 들어 10일 이동 평균에서 M은 10입니다. N은 1입니다. 10개 입력 행의 각 그룹이 평균 가격 하나를 만들기 때문입니다.

내장 테이블 함수 vs 사용자 정의 테이블 함수

Snowflake는 수백 개의 내장 함수를 제공하며, 그중 상당수가 테이블 함수입니다. 내장 테이블 함수는 System-Defined Table Functions (시스템 정의 테이블 함수)에 나열되어 있습니다.

사용자는 자신의 함수를 작성할 수도 있으며, 이를 사용자 정의 함수 또는 "UDF"라고 합니다. 일부 UDF는 스칼라이고 일부는 테이블형입니다. 사용자 정의 테이블 함수는 "UDTF"라고 부릅니다. UDF(UDTF 포함)에 대한 자세한 내용은 User-defined functions overview를 참고하세요.

내장 테이블 함수와 사용자 정의 테이블 함수는 일반적으로 같은 규칙을 따릅니다. 예를 들어 둘 다 SQL 문장에서 같은 방식으로 호출됩니다.

테이블 함수 사용하기

FROM 절에서 테이블 함수 사용

테이블은 행 집합을 포함합니다. 마찬가지로 테이블 함수도 행 집합을 반환합니다. 테이블과 테이블 함수는 모두 행 집합이 필요한 문맥에서 사용됩니다. 구체적으로 테이블 함수는 SQL 문장의 FROM 절에서 사용됩니다.

SQL 컴파일러가 테이블 함수를 행의 소스로 인식하게 하기 위해, Snowflake는 테이블 함수 호출을 TABLE() 키워드로 감싸야 한다고 요구합니다.

예를 들어 다음 문장은 DATE 값을 인수로 받는 record_high_temperatures_for_date()라는 테이블 함수를 호출합니다:

SELECT city_name, temperature
    FROM TABLE(record_high_temperatures_for_date('2021-06-27'::DATE))
    ORDER BY city_name;

TABLE() 구문에 대한 자세한 내용은 Table literals를 참고하세요.

테이블 함수는 일반 함수처럼 각 호출에서 0개, 1개 또는 여러 입력 인수를 받을 수 있습니다. 각 인수는 스칼라 표현식이어야 합니다.

테이블 함수 호출 구문에 대한 자세한 내용은 이 주제의 Syntax를 참고하세요.

테이블 함수에 입력으로 테이블 사용

테이블 함수의 인수는 리터럴 또는 테이블의 컬럼 같은 표현식일 수 있습니다. 예를 들어 아래 SELECT 문은 테이블의 값을 테이블 함수에 인수로 전달합니다:

CREATE OR REPLACE table dates_of_interest (event_date DATE);
INSERT INTO dates_of_interest (event_date) VALUES
    ('2021-06-21'::DATE),
    ('2022-06-21'::DATE);

CREATE OR REPLACE FUNCTION record_high_temperatures_for_date(d DATE)
    RETURNS TABLE (event_date DATE, city VARCHAR, temperature NUMBER)
    as
    $$
    SELECT d, 'New York', 65.0
    UNION ALL
    SELECT d, 'Los Angeles', 69.0
    $$;
SELECT
        doi.event_date as "Date", 
        record_temperatures.city,
        record_temperatures.temperature
    FROM dates_of_interest AS doi,
         TABLE(record_high_temperatures_for_date(doi.event_date)) AS record_temperatures
      ORDER BY doi.event_date, city;
+------------+-------------+-------------+
| Date       | CITY        | TEMPERATURE |
|------------+-------------+-------------|
| 2021-06-21 | Los Angeles |          69 |
| 2021-06-21 | New York    |          65 |
| 2022-06-21 | Los Angeles |          69 |
| 2022-06-21 | New York    |          65 |
+------------+-------------+-------------+

테이블 함수의 인수는 뷰와 다른 테이블 함수를 포함해 다른 테이블과 같은 소스에서 올 수 있습니다.

시스템 정의 테이블 함수 목록

Snowflake는 다음 시스템 정의(즉 내장) 테이블 함수를 제공합니다.

하위 분류 함수 비고
데이터 로딩 (Data Loading) INFER_SCHEMA 자세한 내용은 Load data into Snowflake 참고
VALIDATE
데이터 생성 (Data Generation) GENERATOR
데이터 변환 (Data Conversion) SPLIT_TO_TABLE
STRTOK_SPLIT_TO_TABLE
차등 프라이버시 (Differential Privacy) CUMULATIVE_PRIVACY_LOSSES
객체 모델링 (Object Modeling) GET_OBJECT_REFERENCES
파라미터화된 쿼리 (Parameterized Queries) TO_QUERY
반정형 쿼리 (Semi-structured Queries) FLATTEN 자세한 내용은 Querying Semi-structured Data 참고
쿼리 결과 (Query Results) RESULT_SCAN 다른 SQL 연산(예: SHOW)의 출력에 SQL 연산을 수행하는 데 사용
쿼리 프로파일 (Query Profile) GET_QUERY_OPERATOR_STATS
기록 및 사용 정보 (Historical & Usage Information) 다음을 포함: Snowflake Information Schema, Account Usage, LOCAL 스키마
사용자 로그인 (User Login) LOGIN_HISTORY, LOGIN_HISTORY_BY_USER
쿼리 (Queries) QUERY_HISTORY, QUERY_HISTORY_BY_*
QUERY_ACCELERATION_HISTORY 곧 폐지 예정(TO BE DEPRECATED) — QUERY_ACCELERATION_HISTORY 뷰 참고. 자세한 내용은 Using the Query Acceleration Service (QAS) 참고
웨어하우스·스토리지 사용 (Warehouse & Storage Usage) DATABASE_STORAGE_USAGE_HISTORY 곧 폐지 예정 — DATABASE_STORAGE_USAGE_HISTORY 뷰 참고
WAREHOUSE_LOAD_HISTORY
WAREHOUSE_METERING_HISTORY 곧 폐지 예정 — WAREHOUSE_METERING_HISTORY 뷰 참고
STAGE_STORAGE_USAGE_HISTORY 곧 폐지 예정 — STAGE_STORAGE_USAGE_HISTORY 뷰 참고
ESTIMATE_HYBRID_TABLE_STORAGE_USAGE 하이브리드 테이블이 사용하는 총 저장 공간의 거의 실시간 추정치를 반환
스토리지 수명주기 정책 (Storage Lifecycle Policies) STORAGE_LIFECYCLE_POLICY_HISTORY Information Schema 테이블 함수. 자세한 내용은 Storage lifecycle policies 참고
컬럼·행 수준 보안 (Column-level & Row-level Security) POLICY_REFERENCES
객체 태깅 (Object Tagging) TAG_REFERENCES Information Schema 테이블 함수
TAG_REFERENCES_ALL_COLUMNS Information Schema 테이블 함수
TAG_REFERENCES_WITH_LINEAGE Account Usage 테이블 함수
계정 복제 (Account Replication) REPLICATION_GROUP_DANGLING_REFERENCES 자세한 내용은 Introduction to replication and failover across multiple accounts 참고
REPLICATION_GROUP_REFRESH_HISTORY, REPLICATION_GROUP_REFRESH_HISTORY_ALL
REPLICATION_GROUP_REFRESH_PROGRESS, REPLICATION_GROUP_REFRESH_PROGRESS_BY_JOB, REPLICATION_GROUP_REFRESH_PROGRESS_ALL
REPLICATION_GROUP_USAGE_HISTORY 곧 폐지 예정 — REPLICATION_GROUP_USAGE_HISTORY 뷰 참고
알림 (Alerts) ALERT_HISTORY 자세한 내용은 Setting up alerts based on data in Snowflake 참고
SERVERLESS_ALERT_HISTORY 곧 폐지 예정 — SERVERLESS_ALERT_HISTORY 뷰 참고
바인드 변수 (Bind variables) BIND_VALUES 자세한 내용은 Retrieve bind variable values 참고
데이터베이스 복제 (Database Replication) DATABASE_REFRESH_HISTORY 자세한 내용은 Replicating databases across multiple accounts 참고
DATABASE_REFRESH_PROGRESS, DATABASE_REFRESH_PROGRESS_BY_JOB
DATABASE_REPLICATION_USAGE_HISTORY 곧 폐지 예정 — DATABASE_REPLICATION_USAGE_HISTORY 뷰 참고
데이터 로딩·전송 (Data Loading & Transfer) COPY_HISTORY
DATA_TRANSFER_HISTORY 곧 폐지 예정 — DATA_TRANSFER_HISTORY 뷰 참고
PIPE_USAGE_HISTORY 곧 폐지 예정 — PIPE_USAGE_HISTORY 뷰 참고
STAGE_DIRECTORY_FILE_REGISTRATION_HISTORY
VALIDATE_PIPE_LOAD
데이터 클러스터링 (테이블 내) (Data Clustering) AUTOMATIC_CLUSTERING_HISTORY 곧 폐지 예정 — AUTOMATIC_CLUSTERING_HISTORY 뷰 참고. 자세한 내용은 Automatic Clustering 참고
Snowflake의 dbt 프로젝트 (dbt Projects on Snowflake) DBT_PROJECT_EXECUTION_HISTORY 자세한 내용은 dbt Projects on Snowflake 참고
동적 테이블 (Dynamic Tables) DYNAMIC_TABLES 자세한 내용은 Create a dynamic table 참고
DYNAMIC_TABLE_GRAPH_HISTORY
DYNAMIC_TABLE_REFRESH_HISTORY
외부 함수 (External Functions) EXTERNAL_FUNCTIONS_HISTORY 자세한 내용은 Writing external functions 참고
외부 테이블 (External Tables) AUTO_REFRESH_REGISTRATION_HISTORY 곧 폐지 예정 — CATALOG_LINKED_DATABASE_USAGE_HISTORY 뷰 참고. 자세한 내용은 Introduction to external tables 참고
EXTERNAL_TABLE_FILES
EXTERNAL_TABLE_FILE_REGISTRATION_HISTORY
Iceberg 테이블 (Iceberg Tables) ICEBERG_TABLE_FILES Information Schema 테이블 함수
ICEBERG_TABLE_SNAPSHOT_REFRESH_HISTORY Information Schema 테이블 함수
리스팅 (Listings) AVAILABLE_LISTINGS
AVAILABLE_LISTING_REFRESH_HISTORY
LISTING_REFRESH_HISTORY
구체화된 뷰 유지관리 (Materialized Views Maintenance) MATERIALIZED_VIEW_REFRESH_HISTORY 곧 폐지 예정 — MATERIALIZED_VIEW_REFRESH_HISTORY 뷰 참고. 자세한 내용은 Working with Materialized Views 참고
머신러닝 (Machine learning) ONLINE_FEATURE_TABLE_REFRESH_HISTORY 자세한 내용은 Feature store commands 참고
알림 (Notifications) NOTIFICATION_HISTORY 자세한 내용은 Using SYSTEM$SEND_EMAIL to send email notifications 참고
SCIM 유지관리 (SCIM Maintenance) REST_EVENT_HISTORY 자세한 내용은 Auditing SCIM API requests 참고
검색 최적화 유지관리 (Search Optimization Maintenance) SEARCH_OPTIMIZATION_HISTORY 곧 폐지 예정 — SEARCH_OPTIMIZATION_HISTORY 뷰 참고. 자세한 내용은 Search optimization service 참고
스트림 (Streams) SYSTEM$STREAM_BACKLOG 자세한 내용은 Introduction to streams 참고
태스크 (Tasks) COMPLETE_TASK_GRAPHS 자세한 내용은 Introduction to tasks 참고
CURRENT_TASK_GRAPHS
SERVERLESS_TASK_HISTORY 곧 폐지 예정 — SERVERLESS_TASK_HISTORY 뷰 참고
TASK_DEPENDENTS
TASK_HISTORY
네트워크 규칙 (Network rules) NETWORK_RULE_REFERENCES Information Schema 테이블 함수. 자세한 내용은 Network rules 참고
데이터 품질 (Data Quality) DATA_METRIC_FUNCTION_EXPECTATIONS
DATA_METRIC_FUNCTION_REFERENCES
DATA_QUALITY_MONITORING_EXPECTATION_STATUS
DATA_QUALITY_MONITORING_RESULTS
SYSTEM$DATA_METRIC_SCAN
SYSTEM$EVALUATE_DATA_QUALITY_EXPECTATIONS
SYSTEM$EVALUATE_DATA_QUALITY_EXPECTATIONS_PERSIST_RESULT
데이터 계보 (Data Lineage) GET_LINEAGE (SNOWFLAKE.CORE) 자세한 내용은 Data Lineage 참고
Cortex Search CORTEX_SEARCH_DATA_SCAN 자세한 내용은 Cortex Search 참고
CORTEX_SEARCH_REFRESH_HISTORY
연락처 (Contacts) GET_CONTACTS
Snowpark Container Services GET_JOB_HISTORY 자세한 내용은 Snowpark Container Services: Monitoring Services 참고
<service_name>!SPCS_GET_EVENTS
<service_name>!SPCS_GET_LOGS
<service_name>!SPCS_GET_METRICS
Snowflake 네이티브 앱 (Snowflake Native Apps) APPLICATION_CALLBACK_HISTORY 자세한 내용은 Callbacks 참고
APPLICATION_SPECIFICATION_STATUS_HISTORY 자세한 내용은 Use app specifications to request controlled access 참고
APPLICATION_CONFIGURATION_VALUE_HISTORY 자세한 내용은 Application configuration 참고
Cortex Agents GET_AI_RECORD_TRACE (SNOWFLAKE.LOCAL) 자세한 내용은 Cortex Agent evaluations 및 AI Observability data 참고. Cortex Agent와 External Agent를 지원하며 agent_typeCORTEX AGENT 또는 EXTERNAL AGENT
GET_AI_OBSERVABILITY_LOGS (SNOWFLAKE.LOCAL) 자세한 내용은 Cortex Agent evaluations 및 AI Observability data 참고. Cortex Agent와 External Agent를 지원하며 agent_typeCORTEX AGENT 또는 EXTERNAL AGENT
GET_AI_OBSERVABILITY_EVENTS (SNOWFLAKE.LOCAL) 자세한 내용은 Monitor Cortex Agent requests, Monitor Cortex Search requests, AI Observability data 참고. agent_typeCORTEX AGENT, EXTERNAL AGENT 또는 CORTEX SEARCH SERVICE
GET_AI_EVALUATION_DATA (SNOWFLAKE.LOCAL) 자세한 내용은 Cortex Agent evaluations 및 AI Observability data 참고. Cortex Agent와 External Agent를 지원하며 agent_typeCORTEX AGENT 또는 EXTERNAL AGENT
SYSTEM$CREATE_EVALUATION_DATASET 자세한 내용은 Cortex Agent evaluations 참고

구문 (Syntax)

SELECT ...
  FROM [ [ [AS] ] ,
         [ LATERAL ]
       ]
       TABLE( ( [ [, ... ] ] ) ) [ [ AS ] ];

함수별 구문은 개별 시스템 정의 테이블 함수 문서를 참고하세요.

사용 참고 사항

  • 테이블 함수는 LATERAL 구성(construct)을 사용해 행 집합에도 적용할 수 있습니다.
  • 테이블 표현식을 활성화하기 위해 Snowflake는 쿼리와 서브쿼리의 FROM 절에서 테이블 표현식에 대한 ANSI/ISO 표준 구문을 지원합니다. 이 구문은 표현식이 단일 행 대신 행 모음을 반환함을 나타내는 데 사용됩니다.
  • 이 ANSI/ISO 구문은 SELECT 목록의 FROM 절에서만 유효합니다. 다른 모든 문맥의 컬렉션 서브쿼리 명세에서는 이 키워드와 괄호를 생략할 수 없습니다.

더 알아보기 (Learn more)