집계 함수는 데이터베이스 전문가가 기대하는 일반적인 방식으로 동작합니다.
ClickHouse는 다음도 지원합니다:
- 컬럼 외에 다른 매개변수도 받는 매개변수화된 집계 함수
- 집계 함수의 동작 방식을 변경하는 조합자
NULL 처리
집계 중에는 NULL 인수를 모두 건너뜁니다. 집계에 인수가 여러 개 있는 경우, 그중 하나 이상이 NULL인 행은 모두 무시됩니다.
이 규칙에는 예외가 있습니다. first_value, last_value 함수와 그 별칭(any, anyLast)은 수정자 RESPECT NULLS가 뒤에 오면 이 규칙의 예외로 처리됩니다. 예를 들어 FIRST_VALUE(b) RESPECT NULLS가 있습니다.
예시:
다음 테이블을 살펴보겠습니다:
┌─x─┬────y─┐
│ 1 │ 2 │
│ 2 │ ᴺᵁᴸᴸ │
│ 3 │ 2 │
│ 3 │ 3 │
│ 3 │ ᴺᵁᴸᴸ │
└───┴──────┘예를 들어 y 컬럼의 값 합계를 구해야 한다고 가정해 보겠습니다:
SELECT sum(y) FROM t_null_big┌─sum(y)─┐
│ 7 │
└────────┘이제 groupArray 함수를 사용해 y 컬럼으로부터 배열을 만들 수 있습니다:
SELECT groupArray(y) FROM t_null_big┌─groupArray(y)─┐
│ [2,2,3] │
└───────────────┘groupArray는 결과 배열에 NULL을 포함하지 않습니다.
사용 사례에 맞는 값으로 NULL을 바꾸려면 COALESCE를 사용할 수 있습니다. 예를 들어 avg(COALESCE(column, 0))는 집계 시 컬럼 값을 사용하고, NULL인 경우 0을 사용합니다:
SELECT
avg(y),
avg(coalesce(y, 0))
FROM t_null_big┌─────────────avg(y)─┬─avg(coalesce(y, 0))─┐
│ 2.3333333333333335 │ 1.4 │
└────────────────────┴─────────────────────┘또한 Tuple을 사용하면 NULL을 스키핑하는 동작을 우회할 수 있습니다. NULL 값만 포함하는 Tuple은 NULL이 아니므로, 집계 함수는 해당 NULL 값 때문에 그 행을 스키핑하지 않습니다.
SELECT
groupArray(y),
groupArray(tuple(y)).1
FROM t_null_big;
┌컬럼이 집계 함수의 인수로 사용되면 집계가 적용되지 않는다는 점에 유의하십시오. 예를 들어 매개변수가 없는 count (count()) 또는 상수 매개변수를 사용하는 (count(1)) 경우에는 블록의 모든 행을 계산합니다(GROUP BY 컬럼은 인수가 아니므로 그 값과 무관함). 반면 count(column)은 column이 NULL이 아닌 행의 개수만 반환합니다.
SELECT
v,
count(1),
count(v)
FROM
(
SELECT if(number < 10, NULL, number % 3) AS v
FROM numbers(15)
)
GROUP BY v
┌그리고 다음은 RESPECT NULLS를 사용하는 first_value의 예시로, NULL 입력값도 그대로 존중되어 NULL 여부와 관계없이 처음 읽은 값을 반환하는 것을 확인할 수 있습니다:
SELECT
col || '_' || ((col + 1) * 5 - 1) AS range,
first_value(odd_or_null) AS first,
first_value(odd_or_null) IGNORE NULLS as first_ignore_null,
first_value(odd_or_null) RESPECT NULLS as first_respect_nulls
FROM
(
SELECT
intDiv(number, 5) AS col,
if(number % 2 == 0, NULL, number) AS odd_or_null
FROM numbers(15)
)
GROUP BY col
ORDER BY col
┌