9.15. Funções de agregação

As funções de agregação retornam um valor único como resultado de um conjunto de valores de entrada. A Tabela 9-45 mostra as funções de agregação nativas. As considerações especiais sobre a sintaxe das funções de agregação são explicadas na Seção 4.2.7 . Consulte a Seção 2.7 para obter informações introdutórias adicionais.

Tabela 9-45. Funções de agregação

Função Tipo do argumento Tipo retornado Descrição
avg(expressão) smallint, integer, bigint, real, double precision, numeric ou interval numeric para qualquer argumento de tipo inteiro, double precision para argumento de tipo ponto flutuante, caso contrário o mesmo tipo de dado do argumento a média (média aritmética) de todos os valores de entrada
count(*)   bigint número de valores de entrada
count(expressão) qualquer um bigint número de valores de entrada para os quais o valor da expressão não é nulo
max(expressão) qualquer tipo de dado numérico, cadeia de caracteres, data ou hora o mesmo tipo de dado do argumento valor máximo da expressão entre todos os valores de entrada
min(expressão) qualquer tipo de dado numérico, cadeia de caracteres, data ou hora o mesmo tipo de dado do argumento valor mínimo da expressão entre todos os valores de entrada
stddev(expressão) smallint, integer, bigint, real, double precision ou numeric double precision para argumentos de ponto flutuante, caso contrário numeric. desvio padrão da amostra dos valores de entrada
sum(expressão) smallint, integer, bigint, real, double precision, numeric ou interval bigint para argumentos smallint ou integer, numeric para argumentos bigint, double precision para argumentos de ponto flutuante, caso contrário o mesmo tipo de dado do argumento somatório da expressão para todos os valores de entrada
variance(expressão) smallint, integer, bigint, real, double precision ou numeric double precision para argumentos de ponto flutuante, caso contrário numeric. variância da amostra dos valores de entrada (quadrado do desvio padrão da amostra)

Deve ser observado que, com exceção do count, estas funções retornam o valor nulo quando nenhuma linha for selecionada. Em particular, sum de nenhuma linha retorna nulo, e não zero como poderia ser esperado. A função coalesce pode ser utilizada para substituir nulo por zero quando for necessário.

Nota: Os usuários acostumados a trabalhar com outros sistemas gerenciadores de banco de dados SQL podem ficar surpresos com as características de desempenho de certas funções de agregação do PostgreSQL, quando a agregação é aplicada a toda a tabela (em outras palavras, não é especificada nenhuma cláusula WHERE). Em particular, uma consulta como

SELECT min(col) FROM alguma_tabela;

será executada pelo PostgreSQL usando a varredura seqüencial de toda a tabela. Outros sistemas de banco de dados podem otimizar as consultas deste tipo utilizando um índice na coluna, caso esteja disponível. De maneira semelhante, as funções de agregação max() e count() sempre requerem que seja aplicada uma varredura seqüencial em toda a tabela no PostgreSQL.

O PostgreSQL não pode implementar facilmente esta otimização, porque também permite consultas em agregações definidas pelo usuário. Uma vez que min(), max() e count() são definidas usando uma API genérica para funções de agregação, não há dispositivo para executar casos especiais destas funções sob certas circunstâncias.

Felizmente existe um recurso simples para contornar os problemas com min() e max(). A consulta mostrada abaixo é equivalente à consulta acima, exceto que tira vantagem de um índice B-tree, caso algum esteja presente na coluna em questão.

SELECT col FROM alguma_tabela ORDER BY col ASC LIMIT 1;

Pode ser utilizada Uma consulta semelhante (obtida trocando DESC por ASC na consulta acima) no lugar de max()).

Infelizmente, não existe uma consulta trivial semelhante que possa ser utilizada para melhorar o desempenho do count() aplicado a toda a tabela.

SourceForge.net Logo