집계 함수
집계 함수는 여러 행의 값을 하나의 결과로 계산합니다. GROUP BY 절과 함께 사용하면 그룹별 집계 결과를 얻을 수 있습니다. NULL 처리는 함수별 규칙을 따릅니다. FIRST/LAST는 선택된 행의 NULL 반환값을 유지합니다.
빠른 참조
| 함수 | 문법 | 설명 |
|---|---|---|
| COUNT | COUNT(*) / COUNT(col) | 전체 행 수 또는 NULL이 아닌 행 수 |
| SUM | SUM(col) | 합계 |
| AVG | AVG(col) | 평균 |
| MIN | MIN(col) | 최솟값 |
| MAX | MAX(col) | 최댓값 |
| STDDEV | STDDEV(col) | 표본 표준편차 |
| STDDEV_POP | STDDEV_POP(col) | 모표준편차 |
| VARIANCE | VARIANCE(col) | 표본 분산 |
| VAR_POP | VAR_POP(col) | 모분산 |
| FIRST | FIRST(sort_expr, return_expr) / FIRST((key1, key2, ...), return_expr) | 정렬 기준 첫 번째 레코드 값 |
| LAST | LAST(sort_expr, return_expr) / LAST((key1, key2, ...), return_expr) | 정렬 기준 마지막 레코드 값 |
| SUMSQ | SUMSQ(col) | 제곱합 |
| MEDIAN | MEDIAN(col) | 중앙값 |
| MODE | MODE(col) | 최빈값 |
| AREA | AREA(y, x) | 곡선 아래 면적 (사다리꼴 적분) |
| SLOPE | SLOPE(y, x) | 선형 회귀 기울기 |
| GROUP_CONCAT | GROUP_CONCAT(col ...) | 그룹 내 값을 문자열로 연결 |
| TS_CHANGE_COUNT | TS_CHANGE_COUNT(col) | 값 변경 횟수 |
| TOP_K | TOP_K(col, k) | 상위 k개 빈도 값 |
| PERCENTILE_CONT | PERCENTILE_CONT(col, ratio) | 연속 분위수 |
| PERCENTILE_DISC | PERCENTILE_DISC(col, ratio) | 이산 분위수 |
| APPROX_PERCENTILE | APPROX_PERCENTILE(col, ratio) | 근사 분위수 |
| CUME_DIST | CUME_DIST(value, threshold) | 누적 분포 비율 |
COUNT
주어진 컬럼의 레코드 개수를 구합니다. COUNT(*)는 NULL을 포함한 전체 행 수를, COUNT(col)은 NULL이 아닌 행 수를 반환합니다.
COUNT(*)
COUNT(column_name)Mach> CREATE LOG TABLE count_table (id1 INTEGER, id2 INTEGER);
Mach> INSERT INTO count_table VALUES(1, 1);
Mach> INSERT INTO count_table VALUES(2, 2);
Mach> INSERT INTO count_table VALUES(null, 4);
Mach> SELECT COUNT(*) FROM count_table;
COUNT(*)
---------
3
Mach> SELECT COUNT(id1) FROM count_table;
COUNT(id1)
-----------
2SUM
숫자 컬럼의 합계를 반환합니다.
SUM(column_name)Mach> SELECT c1, SUM(c2) FROM sum_table GROUP BY c1;
c1 SUM(c2)
--------------------
1 6
2 6
3 4AVG
숫자형 컬럼의 평균값을 반환합니다.
AVG(column_name)Mach> SELECT id1, AVG(id2) FROM avg_table GROUP BY id1;
id1 AVG(id2)
---------------------
1 2
2 2
NULL 4MIN
지정한 숫자 컬럼의 최솟값을 반환합니다.
MIN(column_name)Mach> SELECT MIN(c1) FROM min_table;
MIN(c1)
--------
1MAX
지정한 숫자 컬럼의 최댓값을 반환합니다.
MAX(column_name)Mach> SELECT MAX(c) FROM max_table;
MAX(c)
-------
30STDDEV / STDDEV_POP
입력 컬럼의 표본 표준편차(STDDEV)와 모표준편차(STDDEV_POP)를 반환합니다.
STDDEV(column)
STDDEV_POP(column)Mach> SELECT c2, STDDEV(c1) FROM stddev_table GROUP BY c2;
c2 STDDEV(c1)
-----------------------
1 0.707107
2 0.707107
Mach> SELECT c2, STDDEV_POP(c1) FROM stddev_table GROUP BY c2;
c2 STDDEV_POP(c1)
---------------------------
1 0.5
2 0.5VARIANCE / VAR_POP
표본 분산(VARIANCE)과 모분산(VAR_POP)을 반환합니다.
VARIANCE(column_name)
VAR_POP(column_name)Mach> SELECT VARIANCE(c1) FROM var_table;
VARIANCE(c1)
--------------
0.333333
Mach> SELECT VAR_POP(c1) FROM var_table;
VAR_POP(c1)
-------------
0.25FIRST / LAST
각 그룹에서 sort_expr 기준으로 정렬했을 때 가장 앞(FIRST) 또는 마지막(LAST) 레코드의 return_expr 값을 반환합니다. 시계열 데이터에서 특정 시점의 값을 가져올 때 유용합니다.
FIRST(sort_expr, return_expr)
LAST(sort_expr, return_expr)복합 정렬 키
복합 키 FIRST/LAST와 정렬 EXTENSION ROLLUP은 Machbase 8.7.3부터 지원합니다. 에디션별 제약은 아래 설명을 확인하십시오.
FIRST((key1 [ASC | DESC], key2 [ASC | DESC], ...), return_expr)
LAST ((key1 [ASC | DESC], key2 [ASC | DESC], ...), return_expr)첫 번째 인자에 괄호로 묶은 2개 이상의 키를 지정합니다. 키를 왼쪽부터 비교하고, 같은 값이면 다음 키를 비교합니다. 방향 생략은 ASC이며 FIRST는 지정한 순서의 첫 행, LAST는 마지막 행의 반환식을 반환합니다. 키 개수를 3개로 제한하는 문법은 아닙니다.
- 첫 키가 NULL인 행은 후보에서 제외합니다. 보조 키의 NULL 비교는 해당 타입의 ORDER BY 규칙을 따릅니다.
- 선택된 행의 반환값이 NULL이면 그대로 NULL을 반환합니다.
- 모든 키가 같으면 특정 행 선택을 보장하지 않습니다. 결정적인 결과에는 고유한 업무 키가 필요합니다.
- 정수형, FLOAT/DOUBLE, DECIMAL, DATETIME, VARCHAR, IPV4/IPV6 정렬 키를 지원합니다. BINARY 키와 복합 키 형태의 DISTINCT는 지원하지 않습니다.
- 일반 SELECT의 키는 BASETIME으로 제한되지 않으며
seq + 1같은 비교 가능한 표현식도 사용할 수 있습니다. 정렬 EXTENSION ROLLUP 정의와 ROLLUP 조회에는 원본 컬럼만 사용합니다. - 외부 ORDER BY는 출력 행을 정렬하며 함수 내부의 선택 기준을 대신하지 않습니다.
- 추가 키의 읽기·비교·복사·상태 유지 비용이 있으므로 성능 무저하를 보장하지 않습니다.
시간과 seq가 같은 행은 event_id로 구분합니다. time은 ASC로 유지하고 event_id만 DESC로 바꿀 수도 있습니다.
SELECT code,
FIRST((time, seq, event_id), price) AS first_price,
LAST((time ASC, seq ASC, event_id DESC), price) AS last_price
FROM raw_tab
GROUP BY code;SELECT와 ORDER BY에서 다른 키 방향을 지정하면 각각 별도 후보를 선택합니다. 출력한 집계값으로 정렬할 때는 해당 별칭을 사용합니다.
SELECT code, FIRST((time, seq, event_id), price) AS first_price
FROM raw_tab
GROUP BY code
ORDER BY FIRST((time, seq, event_id DESC), price);8.7.3 Standard에서는 FIRST((time, ROWID), price)처럼 공개 ROWID를 두 번째 이후의
명시적 보조 키로 사용할 수 있습니다. 원본 저장 행을 식별하며 업무 순서나 입력 순서를
뜻하지 않습니다. Cluster에서는 공개 ROWID 키를 지원하지 않습니다.
ROWID 예제와 제약을 확인하십시오.
단일 키 예제
Mach> SELECT group_no, FIRST(id, name) FROM firstlast_table GROUP BY group_no;
group_no first(id, name)
----------------------------
0 John
1 Grey
Mach> SELECT group_no, LAST(id, name) FROM firstlast_table GROUP BY group_no;
group_no last(id, name)
---------------------------
0 Ryan
1 KyleSUMSQ
숫자 값들의 제곱합을 반환합니다.
SUMSQ(value)Mach> SELECT c1, SUMSQ(c2) FROM sumsq_table GROUP BY c1;
c1 SUMSQ(c2)
----------------------
1 14
2 41MEDIAN
숫자식의 정확한 중앙값을 반환합니다.
MEDIAN(value)SELECT MEDIAN(temp_c) FROM sensor_log;MODE
입력 집합에서 가장 자주 나타나는 숫자 값(최빈값)을 반환합니다. 최빈값이 여러 개면 더 작은 값을 반환합니다.
MODE(value)SELECT MODE(alarm_code) FROM event_log;AREA
숫자형 (x, y) 점들로 이루어진 곡선 아래 면적을 사다리꼴 적분으로 계산합니다. 유효한 점이 2개 미만이면 NULL을 반환합니다.
AREA(y, x)SELECT AREA(power_kw, sample_sec) FROM power_log;SLOPE
숫자형 (x, y) 점들에 대한 선형 회귀 직선의 기울기를 계산합니다. x 분산이 0이거나 유효 데이터가 부족하면 NULL을 반환합니다.
SLOPE(y, x)SELECT SLOPE(temp_c, sample_sec) FROM sensor_log;GROUP_CONCAT
그룹 내 컬럼 값들을 문자열로 이어 붙여 반환합니다.
GROUP_CONCAT(
[DISTINCT] column
[ORDER BY column [ASC | DESC] [, ...]]
[SEPARATOR str_val]
)Mach> SELECT GROUP_CONCAT(name) FROM concat_table GROUP BY id2;
G_NAMES
---------
Jack,Jack,Ram
Jill,Zara,John
Mach> SELECT GROUP_CONCAT(DISTINCT name SEPARATOR '.') FROM concat_table GROUP BY id2;
G_NAMES
---------
Jack.Ram
Jill.Zara.JohnTS_CHANGE_COUNT
시간순으로 입력된 컬럼 값의 변경 횟수를 반환합니다. VARCHAR 타입은 지원하지 않습니다.
TS_CHANGE_COUNT(column)Mach> SELECT id, TS_CHANGE_COUNT(ip) FROM ipcount_table GROUP BY id;
id TS_CHANGE_COUNT(ip)
--------------------------------
1 4
2 2TOP_K
가장 자주 등장한 k개의 숫자 값을 value:count 형식의 문자열로 반환합니다. 빈도 내림차순, 동일 빈도 시 값 오름차순으로 정렬됩니다.
TOP_K(value, k)SELECT TOP_K(alarm_code, 3) FROM event_log;
-- 결과 예: 101:532,205:317,301:90PERCENTILE_CONT / PERCENTILE_DISC
정확한 분위값을 계산하는 집계 함수입니다. ratio는 0.0 이상 1.0 이하의 상수여야 합니다.
PERCENTILE_CONT: 인접한 정렬 값 사이를 보간합니다.PERCENTILE_DISC: 실제 관측값 중 하나를 선택합니다.
PERCENTILE_CONT(value, ratio)
PERCENTILE_DISC(value, ratio)축약형으로 P05, P10, P90, P95 함수도 제공합니다.
SELECT PERCENTILE_CONT(latency_ms, 0.95) AS p95,
PERCENTILE_DISC(latency_ms, 0.50) AS p50
FROM api_log;
-- 축약형
SELECT P05(response_ms), P95(response_ms) FROM web_log;APPROX_PERCENTILE
근사 분위수 함수입니다. 데이터가 매우 크고 작은 오차를 허용할 때 유용합니다. APPROX_MEDIAN, APPROX_P05, APPROX_P10, APPROX_P90, APPROX_P95 축약형도 있습니다.
APPROX_PERCENTILE(value, ratio)
APPROX_MEDIAN(value)
APPROX_P95(value)SELECT APPROX_PERCENTILE(latency_ms, 0.95) AS ap95,
APPROX_MEDIAN(latency_ms) AS amedian
FROM api_log;CUME_DIST
value가 threshold 이하인 행의 누적 비율(0.0 ~ 1.0)을 반환합니다. 윈도우 함수가 아닌 집계 함수입니다.
CUME_DIST(value, threshold)SELECT CUME_DIST(latency_ms, 100) FROM api_log;