Passer au contenu principal

Introduction

ClickHouse ne dispose pas d’opérateur pivot, mais il est possible d’obtenir un comportement similaire à l’aide des combinateurs de fonctions d’agrégation, en particulier ceux dotés du suffixe -Map. Dans cet article, nous allons voir comment faire. Une vidéo couvrant le même sujet est également disponible ci-dessous :

Comprendre les combinateurs de fonctions d’agrégation

Commençons par un exemple simple. Nous allons utiliser clickhouse-local, que vous pouvez lancer avec la commande suivante :
La requête suivante appelle la fonction sumMap, qui prend une map en entrée et additionne les valeurs de chaque clé :
Ce n’est pas un exemple particulièrement intéressant, car il renvoie la même map que celle passée en argument. Appelons maintenant sumMap sur plusieurs lignes de maps ;
La clé ClickHouse apparaît dans les deux lignes et ses valeurs sont additionnées. La clé ClickBench n’apparaît que sur une seule ligne ; elle ne totalise donc qu’une seule valeur, et renvoie cette valeur ! Nous pouvons également utiliser maxMap pour trouver les valeurs maximales par clé :
Ou bien, nous pouvons utiliser avgMap pour trouver la valeur moyenne pour chaque clé :
Nous espérons que cela vous a permis de mieux comprendre le fonctionnement de ces combinateurs de fonctions.

Application réelle : jeu de données sur les prix de l’immobilier au Royaume-Uni

Nous allons maintenant les utiliser sur un jeu de données plus vaste dans le ClickHouse SQL playground. Nous pouvons nous connecter au playground à l’aide de clickhouse-client :
Nous allons interroger la table uk_price_paid, commençons donc par explorer les données qu’elle contient :
On voit ci-dessus que la table contient différents champs liés aux ventes immobilières au Royaume-Uni.

Regroupement et agrégation par décennie

Calculons les prix médians par comté pour chaque décennie du jeu de données :

Filtrage des résultats

Nous pouvons filtrer les résultats pour n’inclure que les données à partir de 2010 :

Combiner plusieurs agrégations

Et si nous voulons trouver le prix le plus élevé par décennie, nous pouvons le faire à l’aide de la fonction maxMap que nous avons vue plus haut :

Application de fonctions aux valeurs d’une map

Nous pouvons également calculer le prix moyen à l’aide de avgMap. Ces valeurs comportent beaucoup de décimales, que nous pouvons supprimer en utilisant la fonction mapApply pour appeler la fonction floor sur chaque valeur de la map :

Regroupement flexible : comtés, districts et codes postaux

Essayons de regrouper par différents champs. Cette fois, nous allons calculer le prix médian par décennie, regroupé par comté et par district :
Nous pourrions également choisir de regrouper par année, puis de concaténer postcode1 et postcode2 dans la map :
Dernière modification le 2 juillet 2026