Neste 3º tópico, falarei sobre as seguintes funções analíticas:

  • PERCENT_RANK
  • RANK
  • RATIO_TO_REPORT
  • ROW_NUMBER
  • STDDEV

1) PERCENT_RANK

Seu retorno varia de 0 a 1. A primeira linha em qualquer conjunto possui o PERCENT_RANK de 0. Funciona tanto como função analítica, quanto função agragada. A meu ver essa função é mais útil quando usada como função analítica, pois é possível determinar rankings para valores, que será exemplificado mais adiante:

 
 -- exemplo de uso do PERCENT_RANK como função agregada
 -- retorna 0, pois estou calculando o percent_rank 
 -- do menor salario

 SELECT PERCENT_RANK(200, .55) WITHIN GROUP
 (ORDER BY SALARIO, COMISSAO)
 FROM CERTIFICACAO.TAB_EMPREGADOS

 -- exemplo de udo do PERCENT_RANK como função analitica
 -- mostra os empregados com os maiores salario, por departamento.
 -- os que possuirem os maiores salarios/departamento possuiram o 
 -- percent_rank = 0, e os que possuirem os menores salarios de
 -- cada setor, possuirão o percent_rank = 1

 SELECT ID_EMP,
 NOME_EMP,
 ID_DEPARTAMENTO,
 SALARIO,
 PERCENT_RANK() 
 OVER (PARTITION BY ID_DEPARTAMENTO ORDER BY SALARIO DESC) 
       AS PERCENT_RANK
 FROM CERTIFICACAO.TAB_EMPREGADOS
 ORDER BY PERCENT_RANK, SALARIO

2) RANK

Calcula o rank (posição) de um valor em um grupo de valores. Pode funcionar tanto como função agregada e função analítica. Função útil para calcular posições dentro de um conjunto de dados, como por exemplo quem foi o funcionário que mais gastou em despesas com viagens:

 
 -- exemplo de uso do rank como função agregada
 -- mostra o rank de um empregado que possua um salario 
 -- de R$1000,00 dentro da tabela

 SELECT RANK(1000) WITHIN GROUP
 (ORDER BY SALARIO)
 FROM CERTIFICACAO.TAB_EMPREGADOS

 -- exemplo de uso do rank como funcao analitica
 -- mostra o rank dos empregados, por salario, em 
 -- cada departamento

 SELECT NOME_EMP,
 ID_DEPARTAMENTO,
 SALARIO,
 RANK() OVER (PARTITION BY ID_DEPARTAMENTO ORDER BY SALARIO DESC)  AS RANK
FROM CERTIFICACAO.TAB_EMPREGADOS

3) RATIO_TO_REPORT

Funciona como função analítica. Calcula a razão, ou proporção de um valor, em relação a soma de um conjunto de valores.

 -- exemplo de uso do RATIO_TO_REPORT como função analitica
 -- no exemplo abaixo, quanto maior for o salario,
 -- maior sera o RATIO deste salario
 -- salarios iguais possuem o mesmo RATIO

 SELECT NOME_EMP, 
 SALARIO,
 RATIO_TO_REPORT (SALARIO) OVER () AS RATIO 
 FROM CERTIFICACAO.TAB_EMPREGADOS
 ORDER BY SALARIO, RATIO

4) ROW_NUMBER

Funciona como função analítica. Atribui um número único para cada linha.

 -- exemplo de uso do ROW_NUMBER como função analitica
 -- retorna o número da linha, por departamento, de cada
 -- empregado, ordenado pelo salário, ou seja, o empregado
 -- do setor 1, que possuir o maior salario, tera um row_number
 -- de 1. Essa ordem é definido na cláusula OVER()

 SELECT NOME_EMP,
 SALARIO,
 ID_dEPARTAMENTO,
 ROW_NUMBER() OVER(PARTITION BY ID_dEPARTAMENTO ORDER BY 
                   SALARIO DESC) AS RN
 FROM CERTIFICACAO.TAB_EMPREGADOS

5) STDDEV

Retorna o Desvio Padrão de um conjunto de valores. Por Desvio Padrão, entende-se:

“O desvio padrão é uma medida de dispersão usada com a média. Mede a variabilidade dos valores à volta da média. O valor mínimo do desvio padrão é 0 indicando que não há variabilidade, ou seja, que todos os valores são iguais à média.
fonte: http://stat2.med.up.pt/cursop/glossario/dpadrao.html”

 -- exemplo de uso do STDDEV como função agregada
 -- retorna o desvio padrão de todos os salarios

 SELECT STDDEV(SALARIO) AS DESVIO
 FROM CERTIFICACAO.TAB_EMPREGADOS

 -- exemplo de uso do STDDEV como função analítica
 -- retorna o desvio padrao acumulado dos salarios, ordenado
 -- pela data de contratação

 SELECT NOME_EMP,
 SALARIO,
 DATA_ADMISSAO,
 STDDEV(SALARIO) OVER(ORDER BY DATA_ADMISSAO)
 FROM CERTIFICACAO.TAB_EMPREGADOS

É isso ai caros DBAs e desenvolvedores, nos vemos no próximo e último post desta série. Até breve. “Keep querying”