[Snowflake] 함수 유형 정리

차지예·2026년 6월 9일

Snowflake

목록 보기
38/49
post-thumbnail

Snowflake 함수는 7가지인데, 딱 두 그룹으로 나눠서 생각

그룹 A — "입력을 넣으면 출력이 어떻게 나오나?" (모양으로 구분)
→ Scalar, Aggregate, Window, Table

그룹 B — "누가 만들고, 어디서 도는가?" (출처로 구분)
→ System, User-defined, External


그룹 A: 입력 → 출력 "모양"으로 구분

이 4개는 "행(row)이 들어가고 나올 때 개수가 어떻게 변하나"로 외우면 됩니다.

1️⃣ Scalar (스칼라) — "1 들어가면 1 나온다"

가장 단순합니다. 한 줄 넣으면 한 값이 나옵니다.

📖 공식 정의: 스칼라 함수는 한 번 호출할 때 하나의 값을 반환하는 함수이며, 대부분 행(row)당 하나의 값을 반환하는 데 사용됩니다.

🔵 비유: 자판기. 동전 1개 넣으면 음료 1개 나옴.

SELECT UUID_STRING();
-- 결과: d29d4bfa-40cb-4159-9186-e10f5d59f031  (값 하나)

2️⃣ Aggregate (집계) — "여러 개 들어가면 1개로 합쳐진다"

여러 행을 하나로 뭉쳐서(collapse) 결과 1개를 냅니다. 합계, 평균, 최댓값 같은 거죠.

📖 공식 정의: 스칼라 함수가 입력 행마다 출력 행 하나를 반환하는 반면, 집계 함수는 여러 입력 행에 대해 출력 행 하나를 반환합니다.

🔵 비유: 믹서기. 과일 여러 개 → 주스 한 잔.

-- 3개 행을 넣어도
SELECT MAX(AMOUNT) FROM ACCOUNT;
-- 결과: 67.78  (제일 큰 값 하나만)

3️⃣ Window (윈도우) — "여러 개 보면서 계산하지만, 행은 그대로 남긴다"

집계랑 비슷한데 결정적 차이가 있습니다. Aggregate는 행을 뭉개버리지만, Window는 행을 그대로 두고 옆에 계산 결과를 붙여줍니다.

📖 공식 정의: SUM 집계 함수가 모든 입력 행에 대해 단일 합계 값을 반환하는 반면, 윈도우 함수는 여러 개의 결과를 반환합니다 — 각 행(현재 행)마다 하나씩, 파티션 내 다른 행들과 비교해서요.
강의 자료 보충: Window는 Aggregate의 하위 집합(subset)이며, 행의 일부(subset)에 대해 집계합니다.

🔵 비유: 반 친구들 키를 줄세우면서, 각자 옆에 "우리 반 최고 키"를 적어주는 것. 친구들이 사라지지 않음.

SELECT ACCOUNT_ID, AMOUNT, MAX(AMOUNT) OVER (PARTITION BY ACCOUNT_ID) FROM ACCOUNT;
ACCOUNT_IDAMOUNTMAX(AMOUNT)
00110.0023.78
00123.7823.78
00267.7867.78

행 3개가 그대로 살아있고, 그룹별 최댓값이 옆에 붙음. (OVER 키워드가 윈도우의 표시!)

함정: "Aggregate vs Window 차이?"
Aggregate = 행 합쳐짐 / Window = 행 그대로 + OVER(PARTITION BY)로 옆에 붙음


4️⃣ Table (테이블) — "1 들어가면 여러 행이 쏟아진다"

스칼라의 반대 느낌. 한 입력에서 여러 행이 나옵니다.

📖 공식 정의: 테이블이 행의 집합을 담듯, 테이블 함수도 행의 집합을 반환합니다. 테이블 함수는 SQL 문의 FROM 절에서 사용됩니다.
SQL 컴파일러가 테이블 함수를 행의 소스로 인식하도록, 테이블 함수 호출은 반드시 TABLE() 키워드로 감싸야 합니다.
강의 자료: 반환 집합은 0개, 1개, 또는 여러 행을 포함할 수 있고, 각 행은 1개 이상의 컬럼을 가질 수 있습니다.

🔵 비유: 씨앗 1개 심으면 → 열매 여러 개 열림.

SELECT RANDSTR(5, RANDOM()), RANDOM() FROM TABLE(GENERATOR(ROWCOUNT => 3));
-- 결과: 행 3개가 생성됨 (My4FU / YiPSS / cu2Hw ...)

포인트: Table 함수는 FROM에 쓰이고, TABLE()로 감싼다는 점!


🖼️ 그룹 A 한 장 요약

함수입력 → 출력비유
Scalar1행 → 1값자판기 (동전 1 → 음료 1)
Aggregate여러 행 → 1값믹서기 (과일들 → 주스 1잔)
Window여러 행 → 행마다 값 (행 유지)키 순서 옆에 "반 최고 키" 적기
Table1행 → 여러 행씨앗 1개 → 열매 여러 개

그룹 B: "누가 만들고 어디서 도나"로 구분

5️⃣ System (시스템) — "Snowflake 운영실 직통 전화"

DB를 조작하거나 상태를 물어볼 때 쓰는 함수. 이름이 system$...로 시작합니다. 강의 자료 기준 3가지 용도:

용도예시 함수하는 일
액션 실행system$cancel_query(...)돌아가는 쿼리 강제 종료
시스템 정보system$pipe_status('my_pipe')파이프 상태 조회 (RUNNING 등)
쿼리 정보system$explain_plan_json(...)쿼리 실행 계획 조회

🔵 비유: 건물 관리사무소. "공조기 꺼주세요(실행)", "엘리베이터 상태 알려주세요(정보)".

💡 암기: 실행 / 시스템 상태 / 쿼리 정보 3종 세트. 전부 system$ 접두사.


6️⃣ User-defined (UDF) — "내가 직접 만든 함수"

기본 제공 함수로 안 되면 직접 만들어 쓰는 함수입니다.

🔵 비유: 시중에 없는 레시피라 직접 만든 나만의 요리.

반환 형태에 따라 두 종류:

  • Scalar UDF → 값 1개 반환
  • UDTF (테이블 UDF) → 0개, 1개, 또는 여러 행을 반환하며 각 행은 1개 이상의 컬럼을 가지고, FROM 절에서 사용됩니다.
CREATE OR REPLACE FUNCTION addone(i INT)
  RETURNS INT LANGUAGE PYTHON RUNTIME_VERSION = '3.12'
  HANDLER = 'addone_py'
  AS $$
def addone_py(i):
    return i+1
$$;

7️⃣ External (외부) — "Snowflake 밖의 서비스를 불러온다"

Snowflake 외부의 원격 코드(예: AWS Lambda)를 호출하는 함수입니다. 핵심은 직접 부르지 않는다는 점!

📖 공식 정의: Snowflake는 원격 서비스를 직접 호출하지 않습니다. 대신 클라우드 제공자의 네이티브 HTTPS 프록시 서비스(예: AWS의 API Gateway)를 통해 원격 서비스를 호출합니다.
Snowflake는 스칼라 외부 함수를 지원하며, 원격 서비스는 받은 각 행마다 정확히 하나의 행을 반환해야 합니다.
외부 함수는 (현재) window 함수를 지원하지 않습니다.

🔵 비유: 음식 배달. 내가 식당(원격 서비스)에 직접 안 가고, 배달앱(API Gateway 프록시)을 거쳐서 주문.

포인트: External function = API integration 필요 + HTTPS 프록시(API Gateway) 경유 + Snowflake가 직접 호출 안 함.


🧠 전체 7개 정리

함수한 줄 정리핵심 키워드
Scalar1 → 1행마다 값 하나
Aggregate여러 개 → 1 (합쳐짐)SUM/MAX, 행 collapse
Window여러 개 보고 → 행마다 값 (행 유지)OVER (PARTITION BY)
Table1 → 여러 행FROM TABLE(...)
SystemDB 조작/상태 조회system$ 접두사
UDF내가 만든 함수Scalar UDF / UDTF
External외부 서비스 호출API integration, 프록시 경유

🔑 헷갈리면 이 두 문장만:
1. "Aggregate는 행을 뭉치고, Window는 행을 살린다(OVER)"
2. "External은 직접 안 부르고 API Gateway를 거친다"

0개의 댓글