.Windows Functions – PostgreSQL

Juliana Jenny Kolb

teste

Home > Simulados on-line  Questões de Concursos > Tecnologia da Informação (TI) > PostgreSQL

Windows Functions – PostgreSQL

As Windows Functions são trabalhadas com um conjunto de linhas definidas por uma cláusula OVER, que permite trabalhar com totais, agrupamentos, ordenações, cálculos complexos dentre outros. Assim, conseguimos melhorar a performance com ordenações avançadas, além de limitarmos o número de linhas que serão retornadas em um subconjunto de dados associados a uma determinada tabela. As funções de agregação que são definidas pelo usuário também podem atuar como Windows Functions quando estas possuem uma chamada com a palavra-chave OVER.

Função Cume_dist()

Esta é utilizada com o intuito de obtermos a classificação da linha atual. Para que este resultado seja obtido é realizado um cálculo no qual ocorre a divisão do número de linhas anteriores a linha atual pelo total de linhas encontradas. Essa razão é apresentada na fórmula a seguir, onde o tipo de retorno é o double precision:

Linha atual = (Número de linhas anteriores a linha atual)/(número total de linhas)

Exemplo:

select *, cume_dist() OVER (ORDER BY departamento_cod) from FUNCIONARIOS_WINDOWS_FUNCTION;

Função row_number()

Essa função é utilizada para obter o número da linha atual dentro de sua partição, sendo este iniciado com o valor um.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  row_number() 
  OVER (PARTITION BY departamento_cod)
   FROM funcionarios_windows_function;

Função Rank()

A função rank() é utilizada basicamente para obtermos a classificação da linha atual onde, em caso de haver empate, o resultado será repetido entre as linhas com mesmo código.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  rank() OVER (
  PARTITION BY departamento_cod ORDER BY nome_departamento)
  FROM funcionarios_windows_function;

Função dense_rank()

A função dense_rank() também é utilizada para a obtenção da classificação atual dos registros, onde as linhas que apresentam valores iguais para os critérios de classificação recebem o mesmo valor, apresentando uma numeração contínua. Esta função difere da função rank() em apenas um aspecto: em caso de empate entre duas ou mais linhas, não havendo nenhuma lacuna presente na sequência dos valores classificados.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  dense_rank() 
  OVER (ORDER BY departamento_cod)
  FROM funcionarios_windows_function;

Função percent_rank()

Quando precisamos obter uma classificação relativa das classificações, podemos utilizar a função percent_rank(), que é utilizada para obtermos a classificação relativa da linha atual. Para que tenhamos a posição relativa da linha atual, realizamos o cálculo com base na seguinte fórmula:

Posição relativa da linha atual = (rank - 1) / (número total de linhas - 1)

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  percent_rank() 
  OVER (PARTITION BY departamento_cod ORDER BY profissao)
  FROM funcionarios_windows_function;

Função first_value()

Esta função é utilizada para a obtenção do valor presente na primeira linha da tabela. Para isso passamos o nome da coluna requerida como argumento de entrada.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  first_value(departamento_cod) OVER (ORDER BY departamento_cod)
  FROM funcionarios_windows_function WHERE departamento_cod > 12;

Função last_value()

Ao contrário da função first_value(), a função last_value() é utilizada para a obtenção do valor presente na última linha de registro presente na tabela, onde utilizamos o nome da coluna como argumento, de igual forma a função anterior.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  last_value(departamento_cod) OVER (ORDER BY nome_departamento)
  FROM funcionarios_windows_function;

Função nth_value()

A próxima função a ser vista é a nth_value(), a qual nos possibilita receber um valor diferente do inicial e do final, obtendo assim um valor presente na enésima linha da tabela. Para utilizar esta função passamos o nome da coluna desejada e o enésimo número como argumentos de entrada. Caso o valor informado não seja encontrado na tabela, o valor apresentado pela função será nulo.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  nth_value(nome_departamento, 2) 
  OVER (PARTITION BY departamento_cod ORDER BY nome_departamento)
  FROM funcionarios_windows_function;

Função ntile()

Esta função nos permite atribuir valores para grupos de resultados, ou seja, um número inteiro a eles. Para melhor entendermos a sua utilização.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  ntile(2) 
  OVER (ORDER BY departamento_cod)
  FROM funcionarios_windows_function;

Função Lag()

A função lag() é utilizada para acessarmos mais de uma linha presente na tabela ao mesmo tempo, sem a necessidade de utilizarmos o SELF JOIN.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  lag(departamento_cod, 3) 
  OVER (ORDER BY departamento_cod)
  FROM funcionarios_windows_function;

Função lead()

A última função a ser apresentada é a lead(), a qual é utilizada para obtermos os valores retornados para linhas de registro com base no deslocamento abaixo da linha atual da partição. Se o argumento de deslocamento não é informado no momento de chamarmos a função, ela será definida como um, por padrão.

Exemplo:

SELECT codigo_func, nome_func, profissao, nome_departamento, departamento_cod, salario,
  lead(nome_departamento, 1) 
  OVER (PARTITION BY departamento_cod ORDER BY departamento_cod)
  FROM funcionarios_windows_function;

Sites de Referência

http://www.postgresql.org/docs/9.4/static/tutorial-window.html

http://www.devmedia.com.br/

msg

Deixe uma resposta