Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função WIDTH_BUCKET() no Oracle


No Oracle, o WIDTH_BUCKET() A função permite construir histogramas de largura equivalente, nos quais o intervalo do histograma é dividido em intervalos de tamanho idêntico.

Para uma determinada expressão, WIDTH_BUCKET() retorna o número do bucket no qual o valor dessa expressão cairia após ser avaliado.

Sintaxe


A sintaxe fica assim:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)

Onde:
  • expr é a expressão para a qual o histograma está sendo criado. Essa expressão deve ser avaliada como um valor numérico ou de data e hora ou para um valor que pode ser convertido implicitamente em um valor numérico ou de data e hora. Se expr avalia como null , a expressão retornará null .
  • min_value e max_value são expressões que resolvem para os pontos finais do intervalo aceitável para expr . Ambas as expressões também devem ser avaliadas como valores numéricos ou de data e hora, e nenhuma delas pode ser avaliada como null .
  • num_buckets é uma expressão que resolve para uma constante que indica o número de buckets. Essa expressão deve ser avaliada como um número inteiro positivo.

Exemplo


Aqui está um exemplo para demonstrar como funciona.
SELECT 
  WIDTH_BUCKET(3, 1, 12, 3) AS r1,
  WIDTH_BUCKET(5, 1, 12, 3) AS r2,
  WIDTH_BUCKET(9, 1, 12, 3) AS r3
FROM DUAL;

Resultado:
   R1    R2    R3 
_____ _____ _____ 
    1     2     3 

Aqui está uma explicação. Vamos examinar cada argumento, começando do último e voltando para o primeiro.
  • Quarto argumento :eu especifico três baldes. Eu faço isso usando 3 como o quarto argumento.
  • Segundo e terceiro argumentos :eu especifico que o intervalo está entre 1 e 12. Nesse caso, meu segundo argumento é 1 e o terceiro argumento é 12 .
  • Primeiro argumento :esse valor é comparado com o segundo e terceiro argumentos, para saber a qual dos três buckets ele deve ser atribuído. No meu exemplo eu chamo WIDTH_BUCKET() três vezes para ilustrar melhor o conceito. Faço isso para fornecer três valores diferentes como o primeiro argumento, cada um atribuído a um bucket diferente.

A tabela a seguir fornece outra maneira de visualizar isso:
Valores Balde
1, 2, 3, 4 Balde 1
5, 6, 7, 8 Balde 2
9, 10, 11, 12 Balde 3

Assim, podemos ver que o primeiro bucket aceita valores entre 1 e 4, o segundo bucket entre 5 e 8 e o terceiro bucket para valores entre 9 e 12.

Se eu mudasse para que houvesse quatro buckets, meu código poderia ficar assim:
SELECT 
  WIDTH_BUCKET(3, 1, 12, 4) AS r1,
  WIDTH_BUCKET(5, 1, 12, 4) AS r2,
  WIDTH_BUCKET(9, 1, 12, 4) AS r3
FROM DUAL;

E a tabela ficaria assim:
Valores Balde
1, 2, 3 Balde 1
4, 5, 6 Balde 2
7, 8, 9 Balde 3
10, 11, 12 Balde 4

Aqui está outro exemplo em que apenas os tamanhos dos buckets mudam:
SELECT 
  WIDTH_BUCKET(5, 1, 12, 3) AS r1,
  WIDTH_BUCKET(5, 1, 12, 6) AS r2,
  WIDTH_BUCKET(5, 1, 12, 10) AS r3
FROM DUAL;

Resultado:
   R1    R2    R3 
_____ _____ _____ 
    2     3     4 

Fora do alcance


Se a entrada estiver fora do intervalo do bucket, você receberá 0 ou num_buckets +1, dependendo se a entrada está abaixo ou acima do intervalo. Nesses casos, o Oracle Database cria um bucket de underflow numerado 0 e um bucket de estouro numerado num_buckets +1.

Exemplo:
SELECT 
  WIDTH_BUCKET(-3, 1, 12, 3),
  WIDTH_BUCKET(20, 1, 12, 3)
FROM DUAL;

Resultado:
   WIDTH_BUCKET(-3,1,12,3)    WIDTH_BUCKET(20,1,12,3) 
__________________________ __________________________ 
                         0                          4