En Oracle, WIDTH_BUCKET()
le permite construir histogramas de ancho equivalente, en los que el rango del histograma se divide en intervalos que tienen el mismo tamaño.
Para una expresión dada, WIDTH_BUCKET()
devuelve el número de depósito en el que caería el valor de esta expresión después de ser evaluada.
Sintaxis
La sintaxis es así:
WIDTH_BUCKET(expr, min_value, max_value, num_buckets)
donde:
expr
es la expresión para la que se crea el histograma. Esta expresión debe evaluarse como un valor numérico o de fecha y hora o como un valor que se puede convertir implícitamente en un valor numérico o de fecha y hora. Siexpr
evalúa anull
, entonces la expresión devuelvenull
.min_value
ymax_value
son expresiones que se resuelven en los puntos finales del rango aceptable paraexpr
. Ambas expresiones también deben evaluarse como valores numéricos o de fecha y hora, y ninguna puede evaluarse comonull
.num_buckets
es una expresión que se resuelve en una constante que indica el número de cubos. Esta expresión debe evaluarse como un entero positivo.
Ejemplo
Aquí hay un ejemplo para demostrar cómo 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
Aquí hay una explicación. Examinemos cada argumento, comenzando por el último y retrocediendo hasta el primero.
- Cuarto argumento :especifico tres baldes. Hago esto usando
3
como cuarto argumento. - Segundo y tercer argumento :especifico que el rango está entre 1 y 12. En este caso, mi segundo argumento es
1
y el tercer argumento es12
. - Primer argumento :Este valor se compara con el segundo y tercer argumento, para saber a cuál de los tres cubos debe asignarse. En mi ejemplo, llamo a
WIDTH_BUCKET()
tres veces para ilustrar mejor el concepto. Hago esto para poder proporcionar tres valores diferentes como primer argumento, cada uno de los cuales se asigna a un depósito diferente.
La siguiente tabla proporciona otra forma de visualizar esto:
Valores | Cubo |
---|---|
1, 2, 3, 4 | Contenedor 1 |
5, 6, 7, 8 | Contenedor 2 |
9, 10, 11, 12 | Contenedor 3 |
Entonces podemos ver que el primer cubo acepta valores entre 1 y 4, el segundo cubo entre 5 y 8, y el tercer cubo es para valores entre 9 y 12.
Si tuviera que cambiarlo para que hubiera cuatro cubos, mi código se vería así:
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;
Y la tabla quedaría así:
Valores | Cubo |
---|---|
1, 2, 3 | Contenedor 1 |
4, 5, 6 | Contenedor 2 |
7, 8, 9 | Contenedor 3 |
10, 11, 12 | Contenedor 4 |
Aquí hay otro ejemplo en el que solo cambian los tamaños de cubo:
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
Fuera de rango
Si la entrada está fuera del rango del depósito, obtendrá 0
o num_buckets
+1, dependiendo de si la entrada está por debajo o por encima del rango. En tales casos, Oracle Database crea un depósito de subdesbordamiento numerado 0
y un cubo de desbordamiento numerado num_buckets
+1.
Ejemplo:
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