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. Seexpr
avalia comonull
, a expressão retornaránull
.min_value
emax_value
são expressões que resolvem para os pontos finais do intervalo aceitável paraexpr
. Ambas as expressões também devem ser avaliadas como valores numéricos ou de data e hora, e nenhuma delas pode ser avaliada comonull
.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