집계 함수

집계 함수 (Aggregation Functions)

집계 함수는 여러 행에 걸쳐 계산을 수행해 단일 결과 값을 반환해요. 이 함수들은 stats, eventstats, streamstats 명령어와 함께 사용해 데이터를 분석하고 요약해요.

출처: 문서

본문

집계 함수는 여러 행에 걸쳐 계산을 수행해 단일 결과 값을 반환해요. 이 함수들은 stats, eventstats, streamstats 명령어와 함께 사용해 데이터를 분석하고 요약해요.

다음 표는 집계 함수가 NULL과 누락(missing) 값을 어떻게 처리하는지 보여줘요:

함수 null Missing
COUNT 세지 않음 (Not counted) 세지 않음 (Not counted)
SUM 무시 (Ignored) 무시 (Ignored)
AVG 무시 (Ignored) 무시 (Ignored)
MAX 무시 (Ignored) 무시 (Ignored)
MIN 무시 (Ignored) 무시 (Ignored)
FIRST 무시 (Ignored) 무시 (Ignored)
LAST 무시 (Ignored) 무시 (Ignored)
LIST 무시 (Ignored) 무시 (Ignored)
VALUES 무시 (Ignored) 무시 (Ignored)

함수 (Functions)

PPL에서 데이터 분석과 요약에 사용할 수 있는 집계 함수는 다음과 같아요.

COUNT

사용법: COUNT(expr), C(expr), c(expr), count(expr)

가져온 행에서 expr 값의 개수를 세어요. C(), c(), count()는 COUNT()의 축약형으로 사용할 수 있어요. 필터링된 개수를 원한다면 eval 표현식을 사용해 필터링 조건을 지정해요.

매개변수:

  • expr (선택): 값을 셀 표현식이에요.

반환 타입: LONG

예제
source=accounts
| stats count(), c(), count, c

쿼리는 다음과 같은 결과를 반환해요:

count() | c() | count | c
4 | 4 | 4 | 4

다음 예제는 특정 조건과 일치하는 레코드만 셉니다:

source=accounts
| stats count(eval(age > 30)) as mature_users

쿼리는 다음과 같은 결과를 반환해요:

mature_users
3

SUM

사용법: SUM(expr)

expr 값의 합을 반환해요.

매개변수:

  • expr (필수): 값을 합산할 표현식이에요.

반환 타입: 입력 타입과 동일 (INTEGER, LONG, FLOAT, 또는 DOUBLE)

예제
source=accounts
| stats sum(age) by gender

쿼리는 다음과 같은 결과를 반환해요:

sum(age) | gender
28 | F
101 | M

AVG

사용법: AVG(expr)

expr의 평균값을 반환해요.

매개변수:

  • expr (필수): 평균을 계산할 표현식이에요.

반환 타입: 숫자 입력의 경우 DOUBLE; DATE, TIME, TIMESTAMP 입력의 경우 입력 타입과 동일

예제
source=accounts
| stats avg(age) by gender

쿼리는 다음과 같은 결과를 반환해요:

avg(age) | gender
28.0 | F
33.666666666666664 | M

MAX

사용법: MAX(expr)

expr의 최댓값을 반환해요. 숫자가 아닌 필드의 경우 알파벳 순서에서 마지막에 오는 값을 반환해요.

매개변수:

  • expr (필수): 최댓값을 찾을 표현식이에요.

반환 타입: 입력 타입과 동일

예제
source=accounts
| stats max(age)

쿼리는 다음과 같은 결과를 반환해요:

max(age)
36

다음 예제는 firstname 텍스트 필드에서 알파벳 순서로 마지막에 오는 값을 반환해요:

source=accounts
| stats max(firstname)

쿼리는 다음과 같은 결과를 반환해요:

max(firstname)
Nanette

MIN

사용법: MIN(expr)

expr의 최솟값을 반환해요. 숫자가 아닌 필드의 경우 알파벳 순서에서 처음에 오는 값을 반환해요.

매개변수:

  • expr (필수): 최솟값을 찾을 표현식이에요.

반환 타입: 입력 타입과 동일

예제
source=accounts
| stats min(age)

쿼리는 다음과 같은 결과를 반환해요:

min(age)
28

다음 예제는 firstname 텍스트 필드에서 알파벳 순서로 처음에 오는 값을 반환해요:

source=accounts
| stats min(firstname)

쿼리는 다음과 같은 결과를 반환해요:

min(firstname)
Amber

VAR_SAMP

사용법: VAR_SAMP(expr)

expr의 표본 분산(sample variance)을 반환해요.

매개변수:

  • expr (필수): 표본 분산을 계산할 표현식이에요.

반환 타입: DOUBLE

예제
source=accounts
| stats var_samp(age)

쿼리는 다음과 같은 결과를 반환해요:

var_samp(age)
10.916666666666666

VAR_POP

사용법: VAR_POP(expr)

expr의 모집단 분산(population variance)을 반환해요.

매개변수:

  • expr (필수): 모집단 분산을 계산할 표현식이에요.

반환 타입: DOUBLE

예제
source=accounts
| stats var_pop(age)

쿼리는 다음과 같은 결과를 반환해요:

var_pop(age)
8.1875

STDDEV_SAMP

사용법: STDDEV_SAMP(expr)

expr의 표본 표준편차(sample standard deviation)를 반환해요.

매개변수:

  • expr (필수): 표본 표준편차를 계산할 표현식이에요.

반환 타입: DOUBLE

예제
source=accounts
| stats stddev_samp(age)

쿼리는 다음과 같은 결과를 반환해요:

stddev_samp(age)
3.304037933599835

STDDEV_POP

사용법: STDDEV_POP(expr)

expr의 모집단 표준편차(population standard deviation)를 반환해요.

매개변수:

  • expr (필수): 모집단 표준편차를 계산할 표현식이에요.

반환 타입: DOUBLE

예제
source=accounts
| stats stddev_pop(age)

쿼리는 다음과 같은 결과를 반환해요:

stddev_pop(age)
2.8613807855648994

DISTINCT_COUNT, DC

사용법: DISTINCT_COUNT(expr), DC(expr)

HyperLogLog++ 알고리즘을 사용해 고유 값의 근사 개수를 반환해요. 두 함수는 동일해요. 알고리즘 정확도와 정밀도 제어에 대한 자세한 내용은 정밀도 제어 (Controlling precision)를 참고해요.

매개변수:

  • expr (필수): 고유 값을 셀 표현식이에요.

반환 타입: LONG

예제
source=accounts
| stats dc(state) as distinct_states, distinct_count(state) as dc_states_alt by gender

쿼리는 다음과 같은 결과를 반환해요:

distinct_states | dc_states_alt | gender
1 | 1 | F
3 | 3 | M

DISTINCT_COUNT_APPROX

사용법: DISTINCT_COUNT_APPROX(expr)

HyperLogLog++ 알고리즘을 사용해 expr의 고유 값 근사 개수를 반환해요.

매개변수:

  • expr (필수): 근사 고유 값을 셀 표현식이에요.

반환 타입: LONG

예제
source=accounts
| stats distinct_count_approx(gender)

쿼리는 다음과 같은 결과를 반환해요:

distinct_count_approx(gender)
2

EARLIEST

사용법: EARLIEST(field [, time_field])

타임스탬프 순서에 따라 필드의 가장 이른 값을 반환해요.

매개변수:

  • field (필수): 가장 이른 값을 반환할 필드예요.
  • time_field (선택): 시간 기반 정렬에 사용할 필드예요. 지정하지 않으면 @timestamp가 기본값이에요.

반환 타입: 입력 필드 타입과 동일

예제
source=events
| stats earliest(message) by host
| sort host

쿼리는 다음과 같은 결과를 반환해요:

earliest(message) | host
Starting up | server1
Initializing | server2

다음 예제는 정렬에 기본 @timestamp 필드 대신 사용자 지정 시간 필드를 사용해요:

source=events
| stats earliest(status, event_time) by category
| sort category

쿼리는 다음과 같은 결과를 반환해요:

earliest(status, event_time) | category
pending | orders
active | users

LATEST

사용법: LATEST(field [, time_field])

타임스탬프 순서에 따라 필드의 가장 최근 값을 반환해요.

매개변수:

  • field (필수): 가장 최근 값을 반환할 필드예요.
  • time_field (선택): 시간 기반 정렬에 사용할 필드예요. 지정하지 않으면 @timestamp가 기본값이에요.

반환 타입: 입력 필드 타입과 동일

예제
source=events
| stats latest(message) by host
| sort host

쿼리는 다음과 같은 결과를 반환해요:

latest(message) | host
Shutting down | server1
Maintenance mode | server2

다음 예제는 정렬에 기본 @timestamp 필드 대신 사용자 지정 시간 필드를 사용해요:

source=events
| stats latest(status, event_time) by category
| sort category

쿼리는 다음과 같은 결과를 반환해요:

latest(status, event_time) | category
cancelled | orders
inactive | users

TAKE

사용법: TAKE(field [, size])

필드에서 원래 값을 반환해요. 이 함수는 반환 값의 순서를 보장하지 않아요.

매개변수:

  • field (필수): 값을 추출할 텍스트 필드예요.
  • size (선택): 반환할 값의 개수예요. 기본값은 10이에요.

반환 타입: ARRAY

예제
source=accounts
| stats take(firstname)

쿼리는 다음과 같은 결과를 반환해요:

take(firstname)
[Amber,Hattie,Nanette,Dale]

PERCENTILE, PERCENTILE_APPROX

사용법: PERCENTILE(expr, percent), PERCENTILE_APPROX(expr, percent)

지정된 백분율에서 expr의 근사 백분위 값을 반환해요.

매개변수:

  • expr (필수): 백분위를 계산할 표현식이에요.
  • percent (필수): 0과 100 사이의 상수 숫자예요.

반환 타입: 입력 타입과 동일

버전 3.1.0부터 백분위 구현이 AVLTreeDigest에서 MergingDigest로 전환되었어요. 자세한 내용은 해당 이슈를 참고해요.

예제
source=accounts
| stats percentile(age, 90) by gender

쿼리는 다음과 같은 결과를 반환해요:

percentile(age, 90) | gender
28 | F
36 | M
백분위 축약 함수 (Percentile shortcut functions)

편의를 위해 OpenSearch PPL은 일반적인 백분위에 대한 축약 함수를 제공해요:

  • PERC<percent>(expr) - PERCENTILE(expr, <percent>)와 동일해요.
  • P<percent>(expr) - PERCENTILE(expr, <percent>)와 동일해요.

0에서 100 사이의 정수 및 소수 백분위가 모두 지원돼요 (예: PERC95, P99.5):

source=accounts 
| stats perc99.5(age);

쿼리는 다음과 같은 결과를 반환해요:

perc99.5(age)
36
source=accounts 
| stats p50(age);

쿼리는 다음과 같은 결과를 반환해요:

p50(age)
33

MEDIAN

사용법: MEDIAN(expr)

expr의 중앙값(50번째 백분위)을 반환해요. PERCENTILE(expr, 50)과 동일해요.

매개변수:

  • expr (필수): 중앙값을 계산할 표현식이에요.

반환 타입: 입력 타입과 동일

예제
source=accounts
| stats median(age)

쿼리는 다음과 같은 결과를 반환해요:

median(age)
33

FIRST

사용법: FIRST(field)

자연 문서 순서에 따라 필드의 첫 번째 non-null 값을 반환해요. 레코드가 없거나 해당 필드의 모든 레코드가 NULL 값을 가지면 NULL을 반환해요.

매개변수:

  • field (필수): 첫 번째 값을 반환할 필드예요.

반환 타입: 입력 필드 타입과 동일

예제
source=accounts
| stats first(firstname) by gender

쿼리는 다음과 같은 결과를 반환해요:

first(firstname) | gender
Nanette | F
Amber | M

LAST

사용법: LAST(field)

자연 문서 순서에 따라 필드의 마지막 non-null 값을 반환해요. 레코드가 없거나 해당 필드의 모든 레코드가 NULL 값을 가지면 NULL을 반환해요.

매개변수:

  • field (필수): 마지막 값을 반환할 필드예요.

반환 타입: 입력 필드 타입과 동일

예제
source=accounts
| stats last(firstname) by gender

쿼리는 다음과 같은 결과를 반환해요:

last(firstname) | gender
Nanette | F
Dale | M

LIST

사용법: LIST(expr)

지정된 표현식의 모든 값을 배열로 수집해요. 값은 문자열로 변환되고, NULL 값은 필터링되며, 중복은 보존돼요. 이 함수는 순서를 보장하지 않고 최대 100개의 값을 반환해요.

매개변수:

  • expr (필수): 값을 수집할 필드 표현식이에요.

반환 타입: ARRAY

이 집계 함수는 array, struct, object 필드 타입을 지원하지 않아요.

예제

다음 예제는 문자열 필드의 모든 값을 배열로 수집해요:

source=accounts
| stats list(firstname)

쿼리는 다음과 같은 결과를 반환해요:

list(firstname)
[Amber,Hattie,Nanette,Dale]

VALUES

사용법: VALUES(expr)

지정된 표현식의 모든 고유 값을 정렬된 배열로 수집해요. 값은 문자열로 변환되고, NULL 값은 필터링되며, 중복은 제거돼요.

매개변수:

  • expr (필수): 고유 값을 수집할 표현식이에요.

반환 타입: ARRAY

plugins.ppl.values.max.limit 설정이 반환되는 고유 값의 최대 개수를 제어해요:

  • 기본값은 0으로, 제한 없이 값을 반환해요.
  • 양의 정수로 설정하면 고유 값의 개수를 제한해요.

자세한 내용은 PPL 설정 문서를 참고해요.

예제

다음 예제는 문자열 필드의 고유 값을 정렬된 배열로 수집해요:

source=accounts
| stats values(firstname)

쿼리는 다음과 같은 결과를 반환해요:

values(firstname)
[Amber,Dale,Hattie,Nanette]

더 알아보기 (Learn more)