Pular para o conteúdo principal

Introdução

O ClickHouse não tem um operador PIVOT, mas podemos obter um comportamento semelhante usando combinadores de funções de agregação e, em particular, aqueles com o sufixo -Map. Neste artigo, vamos aprender a fazer isso. Também há um vídeo que aborda o mesmo conteúdo, que você pode assistir abaixo:

Entendendo os combinadores de funções de agregação

Vamos começar com um exemplo simples. Vamos usar o clickhouse-local, que pode ser iniciado executando o seguinte:
A consulta a seguir chama a função sumMap, que recebe um map e soma os valores de cada chave:
Este não é um exemplo particularmente interessante, pois retorna o mesmo map que passamos. Agora, vamos chamar sumMap em várias linhas com maps;
A chave ClickHouse apareceu nas duas linhas, e seus valores foram somados. A chave ClickBench estava presente em apenas uma linha, então a soma envolve um único valor, e o resultado é esse próprio valor! Também podemos usar maxMap para encontrar os valores máximos por chave:
Ou podemos usar avgMap para encontrar a média dos valores por chave:
Esperamos que isso tenha dado uma ideia de como esses combinadores de função funcionam.

Aplicação prática: conjunto de dados de preços de imóveis do Reino Unido

Agora vamos usá-los em um conjunto de dados maior no playground SQL do ClickHouse. Podemos nos conectar ao playground usando o clickhouse-client:
Vamos consultar a tabela uk_price_paid, então vamos explorar os dados dessa tabela:
Podemos ver acima que a tabela contém vários campos relacionados à venda de imóveis no Reino Unido.

Agrupando e agregando por década

Vamos calcular a mediana dos preços agrupados por condado para cada década no conjunto de dados:

Filtrando os resultados

Podemos filtrar os resultados para incluir apenas dados de 2010 em diante:

Combinando várias agregações

E, se quisermos encontrar o preço máximo por década, podemos fazer isso usando a função maxMap que vimos antes:

Aplicando funções aos valores do map

Como alternativa, podemos calcular o preço médio usando avgMap. Esses valores têm muitas casas decimais, que podemos simplificar usando a função mapApply para chamar a função floor em cada valor do map:

Agrupamento flexível: condados, distritos e códigos postais

Vamos tentar agrupar por alguns campos diferentes. Desta vez, vamos calcular a mediana do preço por década, agrupada por condado e distrito:
Também poderíamos agrupar por ano e, em seguida, concatenar postcode1 e postcode2 no map:
Última modificação em 25 de junho de 2026