테이블(Table) 함수
테이블(Table) 함수
테이블 함수는 각 입력 행에 대해 행 집합을 반환합니다. 반환되는 집합은 0개, 1개 또는 여러 행이 될 수 있습니다. 각 행은 하나 이상의 컬럼을 포함할 수 있습니다.
테이블 함수는 "tabular functions"라고도 불립니다.
본문
테이블 함수란 무엇인가?
테이블 함수는 함수가 개별 입력마다 여러 행을 반환할 때 주로 사용됩니다.
테이블 함수가 호출될 때마다 반환되는 행 수가 달라질 수 있습니다. 예를 들어 지정된 날짜의 기록상 최고 기온 목록을 반환하는 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_type은 CORTEX AGENT 또는 EXTERNAL AGENT |
| GET_AI_OBSERVABILITY_LOGS (SNOWFLAKE.LOCAL) | 자세한 내용은 Cortex Agent evaluations 및 AI Observability data 참고. Cortex Agent와 External Agent를 지원하며 agent_type은 CORTEX AGENT 또는 EXTERNAL AGENT |
|
| GET_AI_OBSERVABILITY_EVENTS (SNOWFLAKE.LOCAL) | 자세한 내용은 Monitor Cortex Agent requests, Monitor Cortex Search requests, AI Observability data 참고. agent_type은 CORTEX AGENT, EXTERNAL AGENT 또는 CORTEX SEARCH SERVICE |
|
| GET_AI_EVALUATION_DATA (SNOWFLAKE.LOCAL) | 자세한 내용은 Cortex Agent evaluations 및 AI Observability data 참고. Cortex Agent와 External Agent를 지원하며 agent_type은 CORTEX 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 절에서만 유효합니다. 다른 모든 문맥의 컬렉션 서브쿼리 명세에서는 이 키워드와 괄호를 생략할 수 없습니다.