9.15. Funções de agregação

As funções de agregação retornam um único valor como resultado de um conjunto de valores de entrada. A Tabela 9-39 mostra as funções de agregação internas. 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-39. 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
bit_and(expressão) smallint, integer, bigint ou bit o mesmo tipo de dado do argumento o AND bit a bit de todos os valores de entrada não nulos, ou nulo se algum for nulo
bit_or(expressão) smallint, integer, bigint ou bit o mesmo tipo de dado do argumento o OR bit a bit de todos os valores de entrada não nulos, ou nulo se algum for nulo
bool_and(expressão) bool bool verdade se todos os valores de entrada forem verdade, senão falso
bool_or(expressão) bool bool verdade se ao menos um dos valores de entrada for verdade, senão falso
count(*)   bigint número de valores de entrada
count(expressão) any bigint número de valores de entrada para os quais o valor da expressão não é nulo
every(expressão) bool bool equivale ao bool_and
max(expressão) qualquer tipo de dado matriz, 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 matriz, 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: As agregações booleanas bool_and e bool_or correspondem às agregações do padrão SQL every e any ou some. Para any e some parece haver uma ambigüidade na sintaxe do padrão:

SELECT b1 = ANY((SELECT b2 FROM t2 ...)) FROM t1 ...;

Neste caso ANY pode ser considerada tanto como levando a uma subconsulta quanto a uma agregação, se a expressão de seleção retornar 1 linha. Portanto, não pode ser dado o nome padrão a estas agregações.

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 CSS válido!