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. Seexpravalia comonull, a expressão retornaránull.min_valueemax_valuesã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
3como o quarto argumento. - Segundo e terceiro argumentos :eu especifico que o intervalo está entre 1 e 12. Nesse caso, meu segundo argumento é
1e 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