집계 함수

집계 함수 (Aggregate functions)

집계 함수(aggregate function)는 여러 행의 값에 대해 합계, 평균, 개수, 최소/최대, 표준편차, 추정 같은 수학적 계산과 일부 비수학적 연산을 수행해요. 스칼라 함수와의 차이, NULL 처리 방식, 사용 예시를 이해하면 집계 함수를 제대로 활용할 수 있어요.

출처: Snowflake SQL Reference

본문

집계 함수는 여러 행(실제로는 0개, 1개 또는 그 이상의 행)을 입력으로 받아 단일 출력을 생성해요. 반면 스칼라 함수는 한 행을 입력으로 받아 한 행(한 값)을 출력으로 생성해요.

집계 함수는 입력이 0개 행을 포함할 때조차 정확히 하나의 행을 반환해요. 일반적으로 입력이 0개 행이면 출력은 NULL이에요. 그러나 집계 함수는 0개 행이 전달될 때 0, 빈 문자열 또는 다른 값을 반환할 수도 있어요.

함수 목록 (하위 범주별) (List of functions by sub-category)

함수 이름 (Function Name) 참고 (Notes)
일반 집계 (General Aggregation)
ANY_VALUE
AVG
CORR
COUNT
COUNT_IF
COVAR_POP
COVAR_SAMP
LISTAGG
MAX
MAX_BY
MEDIAN
MIN
MIN_BY
MODE
PERCENTILE_CONT 다른 집계 함수와 다른 문법을 사용
PERCENTILE_DISC 다른 집계 함수와 다른 문법을 사용
STDDEV, STDDEV_SAMP STDDEVSTDDEV_SAMP는 별칭(alias)
STDDEV_POP
SUM
VAR_POP
VAR_SAMP
VARIANCE_POP VAR_POP의 별칭
VARIANCE, VARIANCE_SAMP VAR_SAMP의 별칭
비트 집계 (Bitwise Aggregation)
BITAND_AGG
BITOR_AGG
BITXOR_AGG
부울 집계 (Boolean Aggregation)
BOOLAND_AGG
BOOLOR_AGG
BOOLXOR_AGG
해시 (Hash)
HASH_AGG
반정형 데이터 집계 (Semi-structured Data Aggregation)
ARRAY_AGG
OBJECT_AGG
선형 회귀 (Linear Regression)
REGR_AVGX
REGR_AVGY
REGR_COUNT
REGR_INTERCEPT
REGR_R2
REGR_SLOPE
REGR_SXX
REGR_SXY
REGR_SYY
통계 및 확률 (Statistics and Probability)
KURTOSIS
SKEW
고유 값 개수 세기 (Counting Distinct Values)
ARRAY_UNION_AGG
ARRAY_UNIQUE_AGG
BITMAP_ABSOLUTE_POSITION
BITMAP_AND
BITMAP_AND_AGG
BITMAP_BIT_POSITION
BITMAP_BUCKET_NUMBER
BITMAP_COUNT
BITMAP_CONSTRUCT_AGG
BITMAP_OR
BITMAP_OR_AGG
BITMAP_TO_ARRAY
기수 추정 (HyperLogLog 사용) (Cardinality Estimation)
APPROX_COUNT_DISTINCT HLL의 별칭
DATASKETCHES_HLL
DATASKETCHES_HLL_ACCUMULATE
DATASKETCHES_HLL_COMBINE
DATASKETCHES_HLL_ESTIMATE 집계 함수가 아니며, DATASKETCHES_HLL_ACCUMULATE 또는 DATASKETCHES_HLL_COMBINE의 스칼라 입력을 사용
HLL
HLL_ACCUMULATE
HLL_COMBINE
HLL_ESTIMATE 집계 함수가 아니며, HLL_ACCUMULATE 또는 HLL_COMBINE의 스칼라 입력을 사용
HLL_EXPORT
HLL_IMPORT
유사도 추정 (MinHash 사용) (Similarity Estimation)
APPROXIMATE_JACCARD_INDEX APPROXIMATE_SIMILARITY의 별칭
APPROXIMATE_SIMILARITY
MINHASH
MINHASH_COMBINE
빈도 추정 (Space-Saving 사용) (Frequency Estimation)
APPROX_TOP_K
APPROX_TOP_K_ACCUMULATE
APPROX_TOP_K_COMBINE
APPROX_TOP_K_ESTIMATE 집계 함수가 아니며, APPROX_TOP_K_ACCUMULATE 또는 APPROX_TOP_K_COMBINE의 스칼라 입력을 사용
백분위 추정 (t-Digest 사용) (Percentile Estimation)
APPROX_PERCENTILE
APPROX_PERCENTILE_ACCUMULATE
APPROX_PERCENTILE_COMBINE
APPROX_PERCENTILE_ESTIMATE 집계 함수가 아니며, APPROX_PERCENTILE_ACCUMULATE 또는 APPROX_PERCENTILE_COMBINE의 스칼라 입력을 사용
집계 유틸리티 (Aggregation Utilities)
GROUPING 집계 함수는 아니지만, GROUP BY 쿼리가 생성한 행에 대한 집계 수준을 결정하기 위해 집계 함수와 함께 사용할 수 있음
GROUPING_ID GROUPING의 별칭
AI 함수 (AI Functions)
AI_AGG
AI_SUMMARIZE_AGG
벡터 집계 (Vector Aggregation)
VECTOR_AVG
VECTOR_MAX
VECTOR_MIN
VECTOR_SUM
시맨틱 뷰 (Semantic views)
AGG

입문 예시 (Introductory example)

다음 예시는 집계 함수(AVG)와 스칼라 함수(COS)의 차이를 보여줘요. 스칼라 함수는 각 입력 행에 대해 하나의 출력 행을 반환하고, 집계 함수는 여러 입력 행에 대해 하나의 출력 행을 반환합니다.

테이블을 만들고 값으로 채웁니다:

CREATE TABLE simple (x INTEGER, y INTEGER);
INSERT INTO simple (x, y) VALUES
 (10, 20),
 (20, 44),
 (30, 70);

테이블을 조회합니다:

SELECT x, y
 FROM simple
 ORDER BY x,y;
+----+----+
| X | Y |
|----+----|
| 10 | 20 |
| 20 | 44 |
| 30 | 70 |
+----+----+

스칼라 함수는 각 입력 행에 대해 하나의 출력 행을 반환해요.

SELECT COS(x)
 FROM simple
 ORDER BY x;
+---------------+
| COS(X) |
|---------------|
| -0.8390715291 |
| 0.4080820618 |
| 0.1542514499 |
+---------------+

집계 함수는 여러 입력 행에 대해 하나의 출력 행을 반환합니다:

SELECT SUM(x)
 FROM simple;
+--------+
| SUM(X) |
|--------|
| 60 |
+--------+

집계 함수와 NULL 값 (Aggregate functions and NULL values)

일부 집계 함수는 NULL 값을 무시해요. 예를 들어 AVG는 값 1, 5, NULL의 평균을 3으로 계산해요. 다음 공식에 기반합니다:

(1 + 5) / 2 = 3

분자와 분모 모두에서 두 개의 비-NULL 값만 사용돼요. 집계 함수에 전달된 값이 모두 NULL이면 집계 함수는 NULL을 반환해요.

일부 집계 함수는 두 개 이상의 컬럼을 전달받을 수 있어요. 예를 들어:

SELECT COUNT(col1, col2) FROM table1;

이런 경우에 집계 함수는 개별 컬럼 중 하나라도 NULL이면 그 행을 무시해요. 예를 들어 다음 쿼리에서 COUNT1을 반환하고 4를 반환하지 않아요. 그 이유는 네 개의 행 중 세 개가 선택된 컬럼에 NULL 값을 하나 이상 포함하기 때문입니다.

CREATE OR REPLACE TABLE test_null_aggregate_functions (x INT, y INT);
INSERT INTO test_null_aggregate_functions (x, y) VALUES
 (1, 2), -- No NULLs.
 (3, NULL), -- One but not all columns are NULL.
 (NULL, 6), -- One but not all columns are NULL.
 (NULL, NULL); -- All columns are NULL.
SELECT COUNT(x, y) FROM test_null_aggregate_functions;
+-------------+
| COUNT(X, Y) |
|-------------|
| 1 |
+-------------+

SUM이 두 개 이상의 컬럼을 참조하는 표현식으로 호출되고, 그 컬럼 중 하나 이상이 NULL이면 표현식이 NULL로 평가되고 행이 무시됩니다:

SELECT SUM(x + y) FROM test_null_aggregate_functions;
+------------+
| SUM(X + Y) |
|------------|
| 3 |
+------------+

이 동작은 일부 컬럼이 NULL일 때 행을 버리지 않는 GROUP BY의 동작과 다릅니다:

SELECT x AS X_COL, y AS Y_COL
 FROM test_null_aggregate_functions
 GROUP BY x, y;
+-------+-------+
| X_COL | Y_COL |
|-------+-------|
| 1 | 2 |
| 3 | NULL |
| NULL | 6 |
| NULL | NULL |
+-------+-------+

더 알아보기 (Learn more)

  • 스칼라 함수 (functions)
  • 컨텍스트 함수 (functions-context)
  • 변환 함수 (functions-conversion)
  • 날짜 및 시간 함수 (functions-date-time)