Esse artigo faz parte da revista SQL Magazine edição 46. Clique aqui para ler todos os artigos desta edição

img

Clique aqui para ler esse artigo em PDF.imagem_pdf.jpg

 

Criando funções de agregação no PostgreSQL

Muito além de COUNT(), SUM() e AVG()

No desenvolvimento de sistemas, freqüentemente encontramos problemas de SQL que envolvem agregações de dados, seja para identificar campos únicos, ou mesmo acumulados dentro de uma tabela. Em um exemplo de um sistema de vendas, poderíamos precisar saber qual o dia em que mais vendas ocorreram em um mês. Isso é realizado através de agregações de dados.

Para implementar a solução, geralmente construímos stored procedures que, através de cursores, varrem os registros de interesse, calculam e retornam os valores desejados. Esta abordagem, apesar de ser funcional, muitas vezes não é a mais otimizada. Para auxiliar nesta questão, muitos SGBDs já oferecem o recurso de função de agregação customizada ou definida pelo usuário – UDA. Esta nova abordagem resulta em um desempenho muito superior ao da utilização de cursores, uma vez que as funções de agregação são previamente processadas pelo query processor do SGBD.

Além de ser uma poderosa ferramenta para a resolução de problemas em linguagem SQL, a UDA abre as portas para um interessante mundo de possibilidades no SGBD, resultando em simplificação do código SQL e otimização no atendimento às requisições.

Neste artigo será abordado como criar e utilizar funções de agregação definidas pelo usuário no PostgreSQL, além de outros tópicos relacionados à capacidade de extensão deste SGBD. Iniciando com a definição geral de funções de agregação e a descrição dos exemplos mais comuns - COUNT(), SUM(), AVG(), serão explicados a sintaxe, o funcionamento e a justificativa para utilização de uma função de agregação personalizada. Alguns exemplos práticos norteiam o estudo até o seu final, sendo utilizados interessantes recursos do SGBD que confirmam o fato de que o PostgreSQL é realmente extensível.

A próxima seção apresenta uma visão geral sobre as funções de agregação.

 

Funções de agregação

Tal como a maioria dos outros SGBDs relacionais, o PostgreSQL suporta funções de agregação. As funções de agregação retornam um único valor a partir de um conjunto de linhas de entrada. Por exemplo, existem funções de agregação para contar o número de registros, determinar o maior e o menor valor de um campo, calcular a soma e a média aritmética de um campo, entre outras. A Tabela 1 mostra as funções de agregação mais comuns em SGBDs relacionais e que no PostgreSQL vêm incorporadas ao sistema principal (core).

 

Função

Argumento

Retorno

Descrição

avg()

numérico
(inteiro ou decimal)

numérico decimal

calcula a média aritmética sobre o conjunto de linhas fornecido

count()

qualquer

número inteiro

retorna o número de linhas de entrada para o qual a expressão é não nula ou simplesmente o total caso seja especificado “*”

max()

numérico, texto ou data/hora

mesmo tipo de dado do argumento

retorna o maior valor entre todos os fornecidos

min()

numérico, texto ou data/hora

mesmo tipo de dado do argumento

retorna o menor valor entre todos os fornecidos

sum()

numérico
(inteiro ou decimal)

numérico inteiro ou decimal (dependendo do tipo do argumento), com maior precisão

calcula a soma da expressão sobre todas as linhas de entrada

Tabela 1. Funções de agregação mais comuns em SGBDs relacionais.

 

Uma instrução SQL, para utilizar uma função de agregação, precisa obedecer a algumas considerações e utilizar uma sintaxe especial: a expressão de agregação.

Uma expressão de agregação representa a aplicação de uma função de agregação perante as linhas selecionadas de uma consulta (query). Uma função de agregação reduz múltiplas entradas em um único valor de saída, tal como o cálculo da soma ou média das entradas. A sintaxe de uma expressão de agregação pode ser de uma das formas descritas na ...

Quer ler esse conteúdo completo? Tenha acesso completo