Conjuntos de agrupamento do PostgreSQL

author
3 minutes, 16 seconds Read

Resumo: neste tutorial, você aprenderá sobre o conceito de conjuntos de agrupamento e como usar a cláusula do PostgreSQL GROUPING SETS para gerar múltiplos conjuntos de agrupamento em uma consulta.

Configurar uma tabela de exemplo

Deixamos começar criando uma nova tabela chamadasales para a demonstração.

Code language: SQL (Structured Query Language) (sql)

A tabela sales armazena o número de produtos vendidos por marca e segmento.

Introdução ao conjunto de agrupamentos do PostgreSQL

Um conjunto de agrupamentos é um conjunto de colunas pelo qual você agrupa usando a cláusula GROUP BY.

Um conjunto de agrupamentos é denotado por uma lista separada por vírgula de colunas colocadas entre parênteses:

Por exemplo, a consulta seguinte usa a cláusula GROUP BY para retornar o número de produtos vendidos por marca e segmento. Em outras palavras, define um conjunto de agrupamento da marca e segmento que é denotado por (brand, segement)

Code language: SQL (Structured Query Language) (sql)

A consulta seguinte encontra o número de produtos vendidos por uma marca. Define um conjunto de agrupamentos (brand):

Code language: SQL (Structured Query Language) (sql)

A consulta seguinte encontra o número de produtos vendidos por segmento. Define um conjunto de agrupamentos (segment):

Code language: SQL (Structured Query Language) (sql)

A consulta seguinte encontra o número de produtos vendidos para todas as marcas e segmentos. Ela define um conjunto de agrupamento vazio que é indicado por ().

Code language: SQL (Structured Query Language) (sql)

Se você quiser todos os conjuntos de agrupamento usando uma única consulta. Para conseguir isso, você pode usar o UNION ALL para combinar todas as consultas acima.

Porque UNION ALL requer que todos os conjuntos de resultados tenham o mesmo número de colunas com tipos de dados compatíveis, você precisa ajustar as consultas adicionando NULL à lista de seleção de cada uma como mostrado abaixo:

Code language: SQL (Structured Query Language) (sql)

Esta consulta gerou um único conjunto de resultados com os agregados para todos os conjuntos de agrupamento.

Even embora a consulta acima funcione como você esperava, ela tem dois problemas principais.

  • Primeiro, ela é bastante longa.
  • Segundo, ela tem um problema de performance porque o PostgreSQL tem que digitalizar a tabela sales separadamente para cada consulta.

Para torná-lo mais eficiente, o PostgreSQL fornece a cláusula GROUPING SETS que é a subcláusula da GROUP BY cláusula.

A GROUPING SETS permite que você defina múltiplos conjuntos de agrupamento na mesma consulta.

A sintaxe geral do GROUPING SETS é a seguinte:

Code language: SQL (Structured Query Language) (sql)

Nesta sintaxe, nós temos quatro conjuntos de agrupamento (c1,c2), (c1), (c2), e ().

Para aplicar esta sintaxe ao exemplo acima, você pode usar a cláusula GROUPING SETS em vez da cláusula UNION ALL como esta:

Code language: SQL (Structured Query Language) (sql)

Esta consulta é muito mais curta e mais legível. Além disso, o PostgreSQL otimizará o número de vezes que ele escaneia a tabela sales e não escaneia múltiplas vezes.

Função de agrupamento

A função GROUPING() aceita um argumento que pode ser um nome de coluna ou uma expressão:

A cláusula column_name ou expression deve combinar com a especificada na cláusula GROUP BY.

A função GROUPING() retorna o bit 0 se o argumento for um membro do conjunto de agrupamento atual e 1 caso contrário.

Veja o seguinte exemplo:

Code language: SQL (Structured Query Language) (sql)

Como mostrado na captura de tela, quando o valor no grouping_brand é 0, a coluna sum mostra o subtotal do brand.

Quando o valor no grouping_segment é zero, a coluna de soma mostra o subtotal do segment.

Você pode usar a função GROUPING() na cláusula HAVING para encontrar o subtotal de cada marca assim:

Neste tutorial, você aprendeu como usar o PostgreSQL GROUPING SETS para gerar múltiplos conjuntos de agrupamentos.

  • Este tutorial foi útil ?
  • Sim Não

Similar Posts

Deixe uma resposta

O seu endereço de email não será publicado.