메인 콘텐츠로 건너뛰기

소개

ClickHouse에는 피벗 연산자가 없지만, 집계 함수 조합자, 특히 -Map 접미사가 붙은 조합자를 사용하면 유사한 동작을 구현할 수 있습니다. 이 글에서는 이를 구현하는 방법을 알아보겠습니다. 동일한 내용을 다루는 동영상도 있으니 아래에서 확인할 수 있습니다:

집계 함수 조합자 이해하기

간단한 예시부터 살펴보겠습니다. 다음 명령으로 실행할 수 있는 clickhouse-local을 사용하겠습니다:
다음 쿼리는 sumMap 함수를 호출합니다. 이 함수는 맵을 입력으로 받아 각 키의 값을 합산합니다:
입력한 것과 동일한 맵을 반환하므로, 그다지 흥미로운 예시는 아닙니다. 이제 여러 행의 맵에 sumMap을 적용해 보겠습니다;
ClickHouse는 두 행 모두에 있었기 때문에 값들이 합산되었습니다. 키 ClickBench는 한 선에만 있으므로 하나의 값만 합산되며, 결과적으로 그 값이 반환됩니다! 또한 maxMap을 사용해 키별 최댓값을 찾을 수도 있습니다:
또는 avgMap을 사용해 키별 평균값을 계산할 수 있습니다:
이제 이러한 함수 combinator가 어떻게 작동하는지 어느 정도 이해하셨기를 바랍니다.

실전 활용: 영국 주택 가격 데이터셋

이제 ClickHouse SQL playground에서 앞서 살펴본 내용을 더 큰 데이터셋에 적용해 보겠습니다. clickhouse-client를 사용해 playground에 연결할 수 있습니다:
uk_price_paid 테이블을 쿼리할 것이므로, 먼저 해당 테이블의 데이터를 살펴보겠습니다:
위에서 볼 수 있듯이, 이 테이블에는 영국의 부동산 거래와 관련된 다양한 필드가 포함되어 있습니다.

10년 단위로 그룹화하고 집계하기

데이터셋에서 10년 단위로 각 카운티의 중간 주택 가격을 계산해 보겠습니다:

결과 필터링

2010년부터의 데이터만 포함하도록 결과를 필터링할 수 있습니다:

여러 집계 함께 사용하기

또한 10년 단위별 최고 가격은 앞서 살펴본 maxMap 함수를 사용해 구할 수 있습니다:

맵 값에 함수 적용하기

또는 avgMap을 사용해 평균 가격을 계산할 수 있습니다. 이 값들은 소수점 이하 자릿수가 많으므로, mapApply 함수를 사용해 맵의 각 값에 floor 함수를 적용하여 깔끔하게 정리할 수 있습니다:

유연한 그룹화: 카운티, 디스트릭트, 우편번호

몇 가지 다른 필드로 그룹화해 보겠습니다. 이번에는 카운티와 디스트릭트별로 그룹화하여 10년 단위 중간 가격을 계산해 보겠습니다:
연도를 기준으로 그룹화한 다음, 맵에서 postcode1postcode2를 이어 붙일 수도 있습니다:
마지막 수정일 2026년 6월 25일