CREATE AGGREGATE nome ( BASETYPE = tipo_dado_entrada, SFUNC = func_trans_estado, STYPE = tipo_dado_estado [ , FINALFUNC = func_final ] [ , INITCOND = cond_inicial ] )
O nome da função de agregação a ser criada.
O tipo do dado de entrada sobre o qual esta função de agregação opera. Pode ser especificado como "ANY" para uma função de agregação que não examina seus valores de entrada (um exemplo é a função count(*)).
O nome da função de transição de estado a ser chamada para cada valor dos dados da entrada. Normalmente esta é uma função com dois argumentos, o primeiro sendo do tipo tipo_dado_estado e o segundo do tipo tipo_dado_entrada. Outra possibilidade, para uma função de agregação que não examina seus valores de entrada, é a função possuir apenas um argumento do tipo tipo_dado_estado. Em qualquer um dos casos a função deve retornar um valor do tipo tipo_dado_estado. Esta função recebe o valor atual do estado e o item atual de dado da entrada, e retorna o valor do próximo estado.
O tipo de dado do valor do estado da agregação.
O nome da função final chamada para calcular o resultado da agregação após todos os dados da entrada terem sido percorridos. A função deve possuir um único argumento do tipo tipo_dado_estado. O tipo de dado do valor da agregação é definido pelo tipo do valor retornado por esta função. Se func_final não for especificado, então o valor do estado final é utilizado como sendo o resultado da agregação, e o tipo da saída fica sendo o tipo_dado_estado.
A atribuição inicial para o valor do estado. Deve ser uma constante literal na forma aceita pelo tipo de dado tipo_dado_estado. Se não for especificado, o valor do estado começa com NULL.
O comando CREATE AGGREGATE permite ao usuário ou ao programador estender as funcionalidades do PostgreSQL definindo novas funções de agregação. Algumas funções de agregação para tipos base, como min(integer) e avg(double precision) estão presentes na distribuição base. Se forem definidos tipos novos, ou se houver a necessidade de uma função de agregação que não esteja presente, então o comando CREATE AGGREGATE pode ser utilizado para criar as funcionalidades desejadas.
Uma função de agregação é identificada pelo seu nome e pelo tipo de dado da entrada. Duas funções de agregação podem possuir o mesmo nome no caso de operarem sobre dados de entrada de tipos diferentes. Para evitar confusão, não crie uma função comum com o mesmo nome e tipo de dado de entrada de uma função de agregação.
Uma função de agregação é constituída de uma ou duas funções comuns: uma função de transição de estado func_trans_estado, e outra função, opcional, para a realização dos cálculos finais func_final. Estas funções são utilizadas da seguinte maneira:
func_trans_estado( estado-interno, próximo-item-dado ) ---> próximo-estado-interno func_final( estado-interno ) ---> valor-da-agregação
O PostgreSQL cria uma variável temporária do tipo tipo_dado_estado para armazenar o estado interno atual da agregação. Para cada item de dado da entrada, a função de transição de estado é chamada para calcular o novo valor do estado interno. Após todos os dados terem sido processados, a função final é chamada uma vez para calcular o valor de saída da agregação. Se não houver nenhuma função final, então o valor do estado final é retornado.
A função de agregação pode possuir uma condição inicial, ou seja, um valor inicial para o valor de estado interno. Este valor é especificado e armazenado no banco de dados em um campo do tipo text, mas deve possuir uma representação externa válida de uma constante do tipo de dado do estado. Se não for especificado, então o valor do estado começa com NULL.
Se a função de transição de estado for declarada como "strict", então não poderá ser chamada com valores da entrada nulos. Para este tipo de função de transição, a execução da agregação é realizada da seguinte maneira. Valores da entrada nulos são ignorados (a função não é chamada e o valor do estado anterior permanece). Se o valor do estado inicial for nulo, então o primeiro valor de entrada que não for nulo substitui o valor do estado, e a função de transição é chamada a partir do segundo valor de entrada que não for nulo. Este procedimento é útil para implementar funções de agregação como max. Observe que este comportamento somente está disponível quando o tipo_dado_estado for do mesmo tipo do tipo_dado_entrada. Quando estes tipos de dado forem diferentes, deverá ser fornecido um valor não nulo para a condição inicial, ou utilizar uma função de transição que não seja estrita.
Se a função de transição de estado não for estrita então será chamada, incondicionalmente, para cada valor da entrada, devendo ser capaz de lidar com valores nulos da entrada e valores nulos de transição. Esta opção permite ao autor da função de agregação ter pleno controle sobre os valores nulos.
Se a função final for declarada "strict", estão não será chamada quando o valor do estado final for nulo; em vez disso, um resultado nulo será produzido automaticamente (É claro que este é apenas o comportamento normal de funções estritas). De qualquer forma, a função final tem sempre a opção de retornar nulo. Por exemplo, a função final para avg retorna nulo quando não há nenhum valor de entrada.
Consulte o capítulo sobre funções de agregação no Guia do Programador do PostgreSQL para ver exemplos completos sobre a sua utilização.