メインコンテンツへスキップ

はじめに

ClickHouse にはピボット演算子はありませんが、集約関数コンビネータ、特に -Map 接尾辞 を使うことで、同様の動作を実現できます。 この記事では、その方法を見ていきます。 同じ内容を解説したビデオもありますので、以下からご覧ください。

集約関数コンビネータを理解する

まずは簡単な例から見ていきましょう。clickhouse-local を使用します。これは次のコマンドを実行して起動できます。
次のクエリはsumMap関数を呼び出します。この関数はマップを受け取り、各キーの値を合計します。
これは、渡したものと同じ マップ を返すだけなので、特に興味深い例ではありません。 では次に、複数行の マップ に対して sumMap を呼び出してみましょう。
キー ClickHouse は両方の行に存在するため、その値は合計されます。キー ClickBench は1行にしか存在しないため、1つの値だけが合計され、結果としてその値が返されます。 maxMap を使うと、キーごとの最大値を求めることもできます。
あるいは、avgMap を使ってキーごとの平均値を求めることもできます。
これで、これらの関数コンビネーターがどのように機能するのか、イメージをつかめたなら幸いです。

実例: 英国の住宅価格データセット

次に、より大規模なデータセットを使って、ClickHouse SQL playgroundでこれらを試してみましょう。 clickhouse-clientを使ってplaygroundに接続できます:
これから uk_price_paid テーブルに対してクエリを実行するので、まずはそのテーブルのデータを見てみましょう:
上記のとおり、このテーブルには英国の不動産売買に関するさまざまなフィールドが含まれています。

10年単位でグループ化して集計する

データセットの各年代について、カウンティごとの価格の中央値を求めてみましょう。

結果の絞り込み

結果を2010年以降のデータのみに絞り込むことができます。

複数の集計を組み合わせる

また、10年ごとの最高価格を求めるには、先ほど見た maxMap 関数を使います。

マップの値に関数を適用する

あるいは、avgMap を使って平均価格を算出することもできます。 これらの値は小数点以下の桁数が多いため、mapApply 関数を使ってマップ内の各値に floor 関数を適用し、見やすくできます。

柔軟なグループ化: 郡、地区、郵便番号

別のフィールドでもグループ化してみましょう。 今回は、郡と地区でグループ化し、10年ごとの価格の中央値を算出します。
年でグループ化し、そのうえで map 内で postcode1postcode2 を連結することもできます:
最終更新日 2026年6月25日