sql >> Base de Datos >  >> RDS >> Oracle

Función WIDTH_BUCKET() en Oracle

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. Si expr evalúa a null , entonces la expresión devuelve null .
  • min_value y max_value son expresiones que se resuelven en los puntos finales del rango aceptable para expr . Ambas expresiones también deben evaluarse como valores numéricos o de fecha y hora, y ninguna puede evaluarse como null .
  • 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 es 12 .
  • 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