Saltar al contenido principal

Introducción

ClickHouse no tiene un operador PIVOT, pero podemos lograr un comportamiento similar usando combinadores de funciones de agregación y, en particular, los que tienen el sufijo -Map. En este artículo, veremos cómo hacerlo. También hay un video que cubre el mismo contenido y que puedes ver a continuación:

Comprender los combinadores de funciones de agregación

Empecemos con un ejemplo sencillo. Vamos a usar clickhouse-local, que puedes ejecutar con lo siguiente:
La siguiente consulta invoca la función sumMap, que toma un mapa y suma los valores de cada clave:
Este no es un ejemplo especialmente interesante, ya que devuelve el mismo mapa que le pasamos. Llamemos ahora a sumMap con varias filas de mapas;
La clave ClickHouse apareció en ambas filas y sus valores se han sumado. La clave ClickBench solo estaba presente en una línea, por lo que al sumar un único valor se obtiene ese mismo valor. También podemos usar maxMap para encontrar los valores máximos por clave:
O podemos usar avgMap para obtener el valor promedio de cada clave:
Esperamos que esto te haya dado una idea de cómo funcionan estos combinadores de funciones.

Aplicación en un caso real: conjunto de datos de precios de la vivienda en el Reino Unido

Ahora vamos a usarlos con un conjunto de datos más grande en el Playground de SQL de ClickHouse. Podemos conectarnos al playground con clickhouse-client:
Vamos a consultar la tabla uk_price_paid, así que exploremos los datos de esa tabla:
Podemos ver más arriba que la tabla contiene varios campos relacionados con la compraventa de viviendas en el Reino Unido.

Agrupación y cálculo de agregados por década

Calculemos los precios medianos agrupados por condado para cada década del conjunto de datos:

Filtrar resultados

Podemos filtrar los resultados para incluir solo datos de 2010 en adelante:

Combinación de varias agregaciones

Y si queremos encontrar el precio máximo por década, podemos hacerlo con la función maxMap que vimos antes:

Aplicación de funciones a los valores del mapa

Como alternativa, podemos calcular el precio medio con avgMap. Estos valores tienen demasiados decimales, algo que podemos corregir usando la función mapApply para llamar a la función floor en cada valor del mapa:

Agrupación flexible: condados, distritos y códigos postales

Probemos a agrupar por algunos campos diferentes. Esta vez vamos a calcular el precio mediano por década, agrupado por condado y distrito:
También podríamos optar por agrupar por año y luego concatenar postcode1 y postcode2 en el mapa:
Última modificación el 25 de junio de 2026