sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo funciona Width_Bucket() en PostgreSQL

En PostgreSQL, width_bucket() es una función matemática que asigna valores a cubos (segmentos individuales) en un histograma de ancho equivalente.

El tipo de devolución es int .

Sintaxis

La función se puede utilizar con cualquiera de las tres sintaxis siguientes:

width_bucket(operand dp, b1 dp, b2 dp, count int)
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
width_bucket(operand anyelement, thresholds anyarray)

Los dos primeros son básicamente iguales, excepto que utilizan diferentes tipos de datos (doble precisión frente a numéricos).

Estas tres sintaxis se explican a continuación.

width_bucket(operand dp, b1 dp, b2 dp, count int)
Devuelve el número de cubo al que se le asignaría el operando en un histograma que cuenta cubos de igual ancho que abarcan el rango b1 a b2; devuelve 0 o cuenta+1 para una entrada fuera del rango.
width_bucket(operand numeric, b1 numeric, b2 numeric, count int)
Devuelve el número de cubo al que se le asignaría el operando en un histograma que cuenta cubos de igual ancho que abarcan el rango b1 a b2; devuelve 0 o cuenta+1 para una entrada fuera del rango.
width_bucket(operand anyelement, thresholds anyarray)
Devuelve el número de depósito al que se le asignaría el operando dada una matriz que enumera los límites inferiores de los depósitos; devuelve 0 para una entrada menor que el primer límite inferior; la matriz de umbrales debe ordenarse, la más pequeña primero, o se obtendrán resultados inesperados.

Ejemplo:primera/segunda sintaxis

Como se mencionó, las dos primeras sintaxis son básicamente las mismas, excepto que describen los diferentes tipos de datos (doble precisión frente a numérico).

Aquí hay un ejemplo para demostrar cómo funcionan las dos primeras sintaxis.

SELECT 
  width_bucket(3, 1, 12, 3),
  width_bucket(5, 1, 12, 3),
  width_bucket(9, 1, 12, 3);

Resultado:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            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 el 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

Así que 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),
  width_bucket(5, 1, 12, 4),
  width_bucket(9, 1, 12, 4);

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

Fuera de rango

Si la entrada está fuera del rango del depósito, obtendrá 0 o recuento +1, dependiendo de si la entrada está por debajo o por encima del rango.

Ejemplo:

SELECT 
  width_bucket(-3, 1, 12, 3),
  width_bucket(20, 1, 12, 3);

Resultado:

 width_bucket | width_bucket
--------------+--------------
            0 |            4

Ejemplo:tercera sintaxis

Para demostrar la tercera sintaxis, tomemos el primer ejemplo anterior y modifíquelo para usar la tercera sintaxis:

SELECT 
  width_bucket(3, array[1, 4, 8]),
  width_bucket(5, array[1, 4, 8]),
  width_bucket(9, array[1, 4, 8]);

Resultado:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            1 |            2 |            3

Aquí creé 3 cubos y asigné valores explícitos a cada uno. En este caso, todos son cubos de igual ancho, pero eso no es un requisito.

Un beneficio importante de la tercera sintaxis es que le permite crear cubos de ancho desigual.

Por ejemplo, podría modificar el ejemplo anterior a este:

SELECT 
  width_bucket(3, array[1, 3, 12]),
  width_bucket(5, array[1, 3, 12]),
  width_bucket(9, array[1, 3, 12]);

Resultado:

 width_bucket | width_bucket | width_bucket
--------------+--------------+--------------
            2 |            2 |            2

Hacer esto cambia los cubos a los que se asigna cada número. Ahora, todos esos números pertenecen al segundo grupo.

La tercera sintaxis podría ser útil para una variedad de casos de uso. Por ejemplo, es posible que tenga un rango de grupos de edad que no estén distribuidos por igual.

SELECT 
  width_bucket(15, array[10, 18, 30, 50, 65]) AS "Age Group (15)",
  width_bucket(45, array[10, 18, 30, 50, 65]) AS "Age Group (45)",
  width_bucket(50, array[10, 18, 30, 50, 65]) AS "Age Group (50)";

Resultado:

 Age Group (15) | Age Group (45) | Age Group (50)
----------------+----------------+----------------
              1 |              3 |              4

Fuera de rango

La función devuelve 0 si la entrada es menor que el primer límite inferior.

Ejemplo:

SELECT width_bucket(8, array[10, 40, 30]);

Resultado:

0

Width_Bucket() frente a CASO

Los ejemplos en esta página también se pueden hacer usando un CASE declaración. La diferencia es que width_bucket() lo hace de una manera más concisa.

Así es como podríamos reescribir el ejemplo anterior usando un CASE declaración.

SELECT
  CASE
    WHEN 8 BETWEEN  0 AND 9 THEN 0
    WHEN 8 BETWEEN 10 AND 39 THEN 1
    WHEN 8 BETWEEN 40 AND 49 THEN 2
    ELSE 3
  END;

Resultado:

0

Tenga en cuenta que la entrada en todos estos ejemplos normalmente sería un nombre de columna o variable en lugar de una constante.