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.